From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47378) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Ur2nh-0001mw-HC for qemu-devel@nongnu.org; Mon, 24 Jun 2013 05:11:10 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Ur2ne-0007IG-54 for qemu-devel@nongnu.org; Mon, 24 Jun 2013 05:11:05 -0400 Received: from mx1.redhat.com ([209.132.183.28]:19317) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Ur2nd-0007I2-Em for qemu-devel@nongnu.org; Mon, 24 Jun 2013 05:11:01 -0400 From: Stefan Hajnoczi Date: Mon, 24 Jun 2013 11:10:20 +0200 Message-Id: <1372065035-19601-9-git-send-email-stefanha@redhat.com> In-Reply-To: <1372065035-19601-1-git-send-email-stefanha@redhat.com> References: <1372065035-19601-1-git-send-email-stefanha@redhat.com> Subject: [Qemu-devel] [PATCH 08/23] ide: Convert DMA read/write commands to ide_cmd_table handler List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , Anthony Liguori , Stefan Hajnoczi From: Kevin Wolf Signed-off-by: Kevin Wolf Signed-off-by: Stefan Hajnoczi --- hw/ide/core.c | 69 ++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 38 insertions(+), 31 deletions(-) diff --git a/hw/ide/core.c b/hw/ide/core.c index 86af4b0..2c8a0ff 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 */ -- 1.8.1.4