From patchwork Tue Jun 18 08:26:01 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kevin Wolf X-Patchwork-Id: 252137 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 9517E2C0092 for ; Tue, 18 Jun 2013 18:29:24 +1000 (EST) Received: from localhost ([::1]:56765 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UorI2-0003Ns-LW for incoming@patchwork.ozlabs.org; Tue, 18 Jun 2013 04:29:22 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36105) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UorFL-00085N-JT for qemu-devel@nongnu.org; Tue, 18 Jun 2013 04:26:36 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UorFG-0005lz-86 for qemu-devel@nongnu.org; Tue, 18 Jun 2013 04:26:35 -0400 Received: from mx1.redhat.com ([209.132.183.28]:58070) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UorFF-0005lk-OX for qemu-devel@nongnu.org; Tue, 18 Jun 2013 04:26:30 -0400 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r5I8QTpg018942 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 18 Jun 2013 04:26:29 -0400 Received: from dhcp-200-207.str.redhat.com (ovpn-116-46.ams2.redhat.com [10.36.116.46]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r5I8QHIK020592; Tue, 18 Jun 2013 04:26:27 -0400 From: Kevin Wolf To: qemu-devel@nongnu.org Date: Tue, 18 Jun 2013 10:26:01 +0200 Message-Id: <1371543971-23241-8-git-send-email-kwolf@redhat.com> In-Reply-To: <1371543971-23241-1-git-send-email-kwolf@redhat.com> References: <1371543971-23241-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 209.132.183.28 Cc: kwolf@redhat.com, stefanha@redhat.com Subject: [Qemu-devel] [PATCH 07/17] ide: Convert PIO read/write commands to ide_cmd_table handler X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Signed-off-by: Kevin Wolf --- hw/ide/core.c | 93 ++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 50 insertions(+), 43 deletions(-) diff --git a/hw/ide/core.c b/hw/ide/core.c index e6cd7b8..86af4b0 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -1110,6 +1110,48 @@ static bool cmd_write_multiple(IDEState *s, uint8_t cmd) return false; } +static bool cmd_read_pio(IDEState *s, uint8_t cmd) +{ + bool lba48 = (cmd == WIN_READ_EXT); + + if (s->drive_kind == IDE_CD) { + ide_set_signature(s); /* odd, but ATA4 8.27.5.2 requires it */ + ide_abort_command(s); + return true; + } + + if (!s->bs) { + ide_abort_command(s); + return true; + } + + ide_cmd_lba48_transform(s, lba48); + s->req_nb_sectors = 1; + ide_sector_read(s); + + return false; +} + +static bool cmd_write_pio(IDEState *s, uint8_t cmd) +{ + bool lba48 = (cmd == WIN_WRITE_EXT); + + if (!s->bs) { + ide_abort_command(s); + return true; + } + + ide_cmd_lba48_transform(s, lba48); + + s->req_nb_sectors = 1; + s->status = SEEK_STAT | READY_STAT; + ide_transfer_start(s, s->io_buffer, 512, ide_sector_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) @@ -1130,19 +1172,19 @@ static const struct { [WIN_DSM] = { cmd_data_set_management, ALL_OK }, [WIN_DEVICE_RESET] = { NULL, CD_OK }, [WIN_RECAL] = { cmd_nop, HD_CFA_OK | SET_DSC}, - [WIN_READ] = { NULL, ALL_OK }, - [WIN_READ_ONCE] = { NULL, ALL_OK }, - [WIN_READ_EXT] = { NULL, HD_CFA_OK }, + [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_READ_NATIVE_MAX_EXT] = { NULL, HD_CFA_OK }, [WIN_MULTREAD_EXT] = { cmd_read_multiple, HD_CFA_OK }, - [WIN_WRITE] = { NULL, HD_CFA_OK }, - [WIN_WRITE_ONCE] = { NULL, HD_CFA_OK }, - [WIN_WRITE_EXT] = { NULL, 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 }, - [CFA_WRITE_SECT_WO_ERASE] = { NULL, CFA_OK }, + [CFA_WRITE_SECT_WO_ERASE] = { cmd_write_pio, CFA_OK }, [WIN_MULTWRITE_EXT] = { cmd_write_multiple, HD_CFA_OK }, - [WIN_WRITE_VERIFY] = { NULL, HD_CFA_OK }, + [WIN_WRITE_VERIFY] = { cmd_write_pio, HD_CFA_OK }, [WIN_VERIFY] = { cmd_verify, HD_CFA_OK | SET_DSC }, [WIN_VERIFY_ONCE] = { cmd_verify, HD_CFA_OK | SET_DSC }, [WIN_VERIFY_EXT] = { cmd_verify, HD_CFA_OK | SET_DSC }, @@ -1235,41 +1277,6 @@ void ide_exec_cmd(IDEBus *bus, uint32_t val) } switch(val) { - case WIN_READ_EXT: - lba48 = 1; - /* fall through */ - case WIN_READ: - case WIN_READ_ONCE: - if (s->drive_kind == IDE_CD) { - ide_set_signature(s); /* odd, but ATA4 8.27.5.2 requires it */ - goto abort_cmd; - } - if (!s->bs) { - goto abort_cmd; - } - ide_cmd_lba48_transform(s, lba48); - s->req_nb_sectors = 1; - ide_sector_read(s); - break; - - case WIN_WRITE_EXT: - lba48 = 1; - /* fall through */ - case WIN_WRITE: - case WIN_WRITE_ONCE: - case CFA_WRITE_SECT_WO_ERASE: - case WIN_WRITE_VERIFY: - if (!s->bs) { - goto abort_cmd; - } - ide_cmd_lba48_transform(s, lba48); - s->error = 0; - s->status = SEEK_STAT | READY_STAT; - s->req_nb_sectors = 1; - ide_transfer_start(s, s->io_buffer, 512, ide_sector_write); - s->media_changed = 1; - break; - case WIN_READDMA_EXT: lba48 = 1; /* fall through */