[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 3/6] ide: repair PIO transfers for cases where nsect
From: |
John Snow |
Subject: |
[Qemu-devel] [PATCH 3/6] ide: repair PIO transfers for cases where nsector > 1 |
Date: |
Wed, 1 Oct 2014 18:55:48 -0400 |
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>
---
hw/ide/ahci.c | 2 +-
hw/ide/core.c | 5 +++++
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c
index 6966a94..db1d226 100644
--- a/hw/ide/ahci.c
+++ b/hw/ide/ahci.c
@@ -1091,7 +1091,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 f15b174..7c1929e 100644
--- a/hw/ide/core.c
+++ b/hw/ide/core.c
@@ -589,6 +589,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)
@@ -829,6 +830,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);
@@ -1230,6 +1233,7 @@ static bool cmd_read_pio(IDEState *s, uint8_t cmd)
ide_cmd_lba48_transform(s, lba48);
s->req_nb_sectors = 1;
+ s->io_buffer_offset = 0;
ide_sector_read(s);
return false;
@@ -1247,6 +1251,7 @@ static bool cmd_write_pio(IDEState *s, uint8_t cmd)
ide_cmd_lba48_transform(s, lba48);
s->req_nb_sectors = 1;
+ s->io_buffer_offset = 0;
s->status = SEEK_STAT | READY_STAT;
ide_transfer_start(s, s->io_buffer, 512, ide_sector_write);
--
1.9.3
- [Qemu-devel] [PATCH 0/6] AHCI Device Fixes, John Snow, 2014/10/01
- [Qemu-devel] [PATCH 2/6] ahci: Update byte count after DMA completion, John Snow, 2014/10/01
- [Qemu-devel] [PATCH 3/6] ide: repair PIO transfers for cases where nsector > 1,
John Snow <=
- [Qemu-devel] [PATCH 4/6] ahci: unify sglist preparation, John Snow, 2014/10/01
- [Qemu-devel] [PATCH 5/6] ide: Correct handling of malformed/short PRDTs, John Snow, 2014/10/01
- [Qemu-devel] [PATCH 6/6] ahci: Fix SDB FIS Construction, John Snow, 2014/10/01
- Re: [Qemu-devel] [PATCH 0/6] AHCI Device Fixes, John Snow, 2014/10/16
- Re: [Qemu-devel] [PATCH 0/6] AHCI Device Fixes, Michael S. Tsirkin, 2014/10/25
- Re: [Qemu-devel] [PATCH 0/6] AHCI Device Fixes, Paolo Bonzini, 2014/10/27
- Re: [Qemu-devel] [PATCH 0/6] AHCI Device Fixes, Stefan Hajnoczi, 2014/10/28