From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47124) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XkIRk-0007fu-Hv for qemu-devel@nongnu.org; Fri, 31 Oct 2014 16:05:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XkIRe-0003de-C7 for qemu-devel@nongnu.org; Fri, 31 Oct 2014 16:05:20 -0400 Received: from mx1.redhat.com ([209.132.183.28]:56624) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XkIRe-0003dU-4l for qemu-devel@nongnu.org; Fri, 31 Oct 2014 16:05:14 -0400 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s9VK5DLU029958 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 31 Oct 2014 16:05:13 -0400 From: John Snow Date: Fri, 31 Oct 2014 16:03:37 -0400 Message-Id: <1414785819-26209-2-git-send-email-jsnow@redhat.com> In-Reply-To: <1414785819-26209-1-git-send-email-jsnow@redhat.com> References: <1414785819-26209-1-git-send-email-jsnow@redhat.com> Subject: [Qemu-devel] [block PATCH v2 1/3] ide: repair PIO transfers for cases where nsector > 1 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: pbonzini@redhat.com, John Snow , armbru@redhat.com, stefanha@redhat.com Currently, for emulated PIO transfers through the AHCI device, any attempt made to request more than a single sector's worth of data will result in the same sector being transferred over and over. For example, if we request 8 sectors via PIO READ SECTORS, the AHCI device will give us the same sector eight times. This patch adds offset tracking into the PIO pathways so that we can fulfill these requests appropriately. Signed-off-by: John Snow --- hw/ide/ahci.c | 2 +- hw/ide/core.c | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c index 61dbed1..3d9b018 100644 --- a/hw/ide/ahci.c +++ b/hw/ide/ahci.c @@ -1092,7 +1092,7 @@ static void ahci_start_transfer(IDEDMA *dma) goto out; } - if (!ahci_populate_sglist(ad, &s->sg, 0)) { + if (!ahci_populate_sglist(ad, &s->sg, s->io_buffer_offset)) { has_sglist = 1; } diff --git a/hw/ide/core.c b/hw/ide/core.c index d316ccf..dab21f0 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -592,6 +592,7 @@ static void ide_sector_read_cb(void *opaque, int ret) ide_set_sector(s, ide_get_sector(s) + n); s->nsector -= n; + s->io_buffer_offset += 512 * n; } void ide_sector_read(IDEState *s) @@ -832,6 +833,8 @@ static void ide_sector_write_cb(void *opaque, int ret) n = s->req_nb_sectors; } s->nsector -= n; + s->io_buffer_offset += 512 * n; + if (s->nsector == 0) { /* no more sectors to write */ ide_transfer_stop(s); @@ -1824,6 +1827,7 @@ void ide_exec_cmd(IDEBus *bus, uint32_t val) s->status = READY_STAT | BUSY_STAT; s->error = 0; + s->io_buffer_offset = 0; complete = ide_cmd_table[val].handler(s, val); if (complete) { -- 1.9.3