[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL for-2.2 02/11] ide: repair PIO transfers for cases wh
From: |
Stefan Hajnoczi |
Subject: |
[Qemu-devel] [PULL for-2.2 02/11] ide: repair PIO transfers for cases where nsector > 1 |
Date: |
Fri, 14 Nov 2014 11:05:48 +0000 |
From: John Snow <address@hidden>
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 <address@hidden>
Reviewed-by: Paolo Bonzini <address@hidden>
Message-id: address@hidden
Signed-off-by: Stefan Hajnoczi <address@hidden>
---
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 1f3f951..dbd6773 100644
--- a/hw/ide/ahci.c
+++ b/hw/ide/ahci.c
@@ -1093,7 +1093,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) {
--
2.1.0
- [Qemu-devel] [PULL for-2.2 00/11] Block patches, Stefan Hajnoczi, 2014/11/14
- [Qemu-devel] [PULL for-2.2 01/11] ahci: Fix byte count regression for ATAPI/PIO, Stefan Hajnoczi, 2014/11/14
- [Qemu-devel] [PULL for-2.2 02/11] ide: repair PIO transfers for cases where nsector > 1,
Stefan Hajnoczi <=
- [Qemu-devel] [PULL for-2.2 03/11] ahci: unify sglist preparation, Stefan Hajnoczi, 2014/11/14
- [Qemu-devel] [PULL for-2.2 04/11] ide: Correct handling of malformed/short PRDTs, Stefan Hajnoczi, 2014/11/14
- [Qemu-devel] [PULL for-2.2 05/11] ahci: add is_ncq predicate helper, Stefan Hajnoczi, 2014/11/14
- [Qemu-devel] [PULL for-2.2 06/11] ahci: Fix FIS decomposition, Stefan Hajnoczi, 2014/11/14
- [Qemu-devel] [PULL for-2.2 07/11] ahci: Reorder error cases in handle_cmd, Stefan Hajnoczi, 2014/11/14
- [Qemu-devel] [PULL for-2.2 08/11] ahci: Check cmd_fis[1] more explicitly, Stefan Hajnoczi, 2014/11/14
- [Qemu-devel] [PULL for-2.2 09/11] ahci: factor out FIS decomposition from handle_cmd, Stefan Hajnoczi, 2014/11/14
- [Qemu-devel] [PULL for-2.2 10/11] block: Fix max nb_sectors in bdrv_make_zero, Stefan Hajnoczi, 2014/11/14
- [Qemu-devel] [PULL for-2.2 11/11] vmdk: Leave bdi intact if -ENOTSUP in vmdk_get_info, Stefan Hajnoczi, 2014/11/14
- Re: [Qemu-devel] [PULL for-2.2 00/11] Block patches, Peter Maydell, 2014/11/14