[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 2/3] ide: restart atapi dma by re-evaluating command
Denis V. Lunev
[Qemu-devel] [PATCH 2/3] ide: restart atapi dma by re-evaluating command packet
Mon, 28 Mar 2016 14:48:21 +0300
From: Pavel Butsykin <address@hidden>
ide_atapi_dma_restart() used to just complete the DMA with an error,
under the assumption that there isn't enough information to restart it.
However, as the contents of the ->io_buffer is preserved, it looks safe to
just re-evaluate it and dispatch the ATAPI command again.
Signed-off-by: Pavel Butsykin <address@hidden>
Reviewed-by: Roman Kagan <address@hidden>
Signed-off-by: Denis V. Lunev <address@hidden>
CC: John Snow <address@hidden>
hw/ide/atapi.c | 13 ++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)
diff --git a/hw/ide/atapi.c b/hw/ide/atapi.c
index 1fe58ab..acc52cd 100644
@@ -488,14 +488,13 @@ static void ide_atapi_cmd_read(IDEState *s, int lba, int
void ide_atapi_dma_restart(IDEState *s)
- * I'm not sure we have enough stored to restart the command
- * safely, so give the guest an error it should recover from.
- * I'm assuming most guests will try to recover from something
- * listed as a medium error on a CD; it seems to work on Linux.
- * This would be more of a problem if we did any other type of
- * DMA operation.
+ * At this point we can just re-evaluate the packet command and start over.
+ * The presence of ->dma_cb callback in the pre_save ensures that the
+ * command has been completely sent and we can safely restart command.
- ide_atapi_cmd_error(s, MEDIUM_ERROR, ASC_NO_SEEK_COMPLETE);
+ s->unit = s->bus->retry_unit;
static inline uint8_t ide_atapi_set_profile(uint8_t *buf, uint8_t *index,