diff options
author | Kevin Wolf | 2013-06-18 10:26:02 +0200 |
---|---|---|
committer | Stefan Hajnoczi | 2013-06-24 10:25:16 +0200 |
commit | 92a6a6f64fbb7b7d3d8cb899a9cb52bd873d33fd (patch) | |
tree | 846a6ac5835c2577612343cf0656a94a7a7816ec /hw/ide/core.c | |
parent | ide: Convert PIO read/write commands to ide_cmd_table handler (diff) | |
download | qemu-92a6a6f64fbb7b7d3d8cb899a9cb52bd873d33fd.tar.gz qemu-92a6a6f64fbb7b7d3d8cb899a9cb52bd873d33fd.tar.xz qemu-92a6a6f64fbb7b7d3d8cb899a9cb52bd873d33fd.zip |
ide: Convert DMA read/write commands to ide_cmd_table handler
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Diffstat (limited to 'hw/ide/core.c')
-rw-r--r-- | hw/ide/core.c | 69 |
1 files changed, 38 insertions, 31 deletions
diff --git a/hw/ide/core.c b/hw/ide/core.c index 86af4b0f66..2c8a0ff431 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -1152,6 +1152,38 @@ static bool cmd_write_pio(IDEState *s, uint8_t cmd) return false; } +static bool cmd_read_dma(IDEState *s, uint8_t cmd) +{ + bool lba48 = (cmd == WIN_READDMA_EXT); + + if (!s->bs) { + ide_abort_command(s); + return true; + } + + ide_cmd_lba48_transform(s, lba48); + ide_sector_start_dma(s, IDE_DMA_READ); + + return false; +} + +static bool cmd_write_dma(IDEState *s, uint8_t cmd) +{ + bool lba48 = (cmd == WIN_WRITEDMA_EXT); + + if (!s->bs) { + ide_abort_command(s); + return true; + } + + ide_cmd_lba48_transform(s, lba48); + ide_sector_start_dma(s, IDE_DMA_WRITE); + + s->media_changed = 1; + + return false; +} + #define HD_OK (1u << IDE_HD) #define CD_OK (1u << IDE_CD) #define CFA_OK (1u << IDE_CFATA) @@ -1175,13 +1207,13 @@ static const struct { [WIN_READ] = { cmd_read_pio, ALL_OK }, [WIN_READ_ONCE] = { cmd_read_pio, ALL_OK }, [WIN_READ_EXT] = { cmd_read_pio, HD_CFA_OK }, - [WIN_READDMA_EXT] = { NULL, HD_CFA_OK }, + [WIN_READDMA_EXT] = { cmd_read_dma, HD_CFA_OK }, [WIN_READ_NATIVE_MAX_EXT] = { NULL, HD_CFA_OK }, [WIN_MULTREAD_EXT] = { cmd_read_multiple, HD_CFA_OK }, [WIN_WRITE] = { cmd_write_pio, HD_CFA_OK }, [WIN_WRITE_ONCE] = { cmd_write_pio, HD_CFA_OK }, [WIN_WRITE_EXT] = { cmd_write_pio, HD_CFA_OK }, - [WIN_WRITEDMA_EXT] = { NULL, HD_CFA_OK }, + [WIN_WRITEDMA_EXT] = { cmd_write_dma, HD_CFA_OK }, [CFA_WRITE_SECT_WO_ERASE] = { cmd_write_pio, CFA_OK }, [WIN_MULTWRITE_EXT] = { cmd_write_multiple, HD_CFA_OK }, [WIN_WRITE_VERIFY] = { cmd_write_pio, HD_CFA_OK }, @@ -1206,10 +1238,10 @@ static const struct { [WIN_MULTREAD] = { cmd_read_multiple, HD_CFA_OK }, [WIN_MULTWRITE] = { cmd_write_multiple, HD_CFA_OK }, [WIN_SETMULT] = { cmd_set_multiple_mode, HD_CFA_OK | SET_DSC }, - [WIN_READDMA] = { NULL, HD_CFA_OK }, - [WIN_READDMA_ONCE] = { NULL, HD_CFA_OK }, - [WIN_WRITEDMA] = { NULL, HD_CFA_OK }, - [WIN_WRITEDMA_ONCE] = { NULL, HD_CFA_OK }, + [WIN_READDMA] = { cmd_read_dma, HD_CFA_OK }, + [WIN_READDMA_ONCE] = { cmd_read_dma, HD_CFA_OK }, + [WIN_WRITEDMA] = { cmd_write_dma, HD_CFA_OK }, + [WIN_WRITEDMA_ONCE] = { cmd_write_dma, HD_CFA_OK }, [CFA_WRITE_MULTI_WO_ERASE] = { cmd_write_multiple, CFA_OK }, [WIN_STANDBYNOW1] = { cmd_nop, ALL_OK }, [WIN_IDLEIMMEDIATE] = { cmd_nop, ALL_OK }, @@ -1277,31 +1309,6 @@ void ide_exec_cmd(IDEBus *bus, uint32_t val) } switch(val) { - case WIN_READDMA_EXT: - lba48 = 1; - /* fall through */ - case WIN_READDMA: - case WIN_READDMA_ONCE: - if (!s->bs) { - goto abort_cmd; - } - ide_cmd_lba48_transform(s, lba48); - ide_sector_start_dma(s, IDE_DMA_READ); - break; - - case WIN_WRITEDMA_EXT: - lba48 = 1; - /* fall through */ - case WIN_WRITEDMA: - case WIN_WRITEDMA_ONCE: - if (!s->bs) { - goto abort_cmd; - } - ide_cmd_lba48_transform(s, lba48); - ide_sector_start_dma(s, IDE_DMA_WRITE); - s->media_changed = 1; - break; - case WIN_READ_NATIVE_MAX_EXT: lba48 = 1; /* fall through */ |