From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41378) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YRPWw-00089Q-04 for qemu-devel@nongnu.org; Fri, 27 Feb 2015 13:20:59 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YRPWr-0001sh-W0 for qemu-devel@nongnu.org; Fri, 27 Feb 2015 13:20:53 -0500 Received: from mx1.redhat.com ([209.132.183.28]:43571) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YRPWr-0001sW-I2 for qemu-devel@nongnu.org; Fri, 27 Feb 2015 13:20:49 -0500 From: Stefan Hajnoczi Date: Fri, 27 Feb 2015 18:18:42 +0000 Message-Id: <1425061147-1411-45-git-send-email-stefanha@redhat.com> In-Reply-To: <1425061147-1411-1-git-send-email-stefanha@redhat.com> References: <1425061147-1411-1-git-send-email-stefanha@redhat.com> Subject: [Qemu-devel] [PULL 44/69] ide: place initial state of the current request to IDEBus List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Peter Maydell , John Snow , Stefan Hajnoczi , Paolo Bonzini From: Paolo Bonzini This moves more common restarting logic to the core IDE code. Signed-off-by: Paolo Bonzini Signed-off-by: John Snow Message-id: 1424708286-16483-10-git-send-email-jsnow@redhat.com Signed-off-by: Stefan Hajnoczi --- hw/ide/core.c | 6 ++++++ hw/ide/internal.h | 2 ++ hw/ide/pci.c | 15 ++++++--------- hw/ide/pci.h | 5 ++--- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/hw/ide/core.c b/hw/ide/core.c index 7607d03..71ec1e7 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -647,6 +647,8 @@ void ide_set_inactive(IDEState *s, bool more) { s->bus->dma->aiocb = NULL; s->bus->retry_unit = -1; + s->bus->retry_sector_num = 0; + s->bus->retry_nsector = 0; if (s->bus->dma->ops->set_inactive) { s->bus->dma->ops->set_inactive(s->bus->dma, more); } @@ -801,6 +803,8 @@ static void ide_sector_start_dma(IDEState *s, enum ide_dma_cmd dma_cmd) void ide_start_dma(IDEState *s, BlockCompletionFunc *cb) { s->bus->retry_unit = s->unit; + s->bus->retry_sector_num = ide_get_sector(s); + s->bus->retry_nsector = s->nsector; if (s->bus->dma->ops->start_dma) { s->bus->dma->ops->start_dma(s->bus->dma, s, cb); } @@ -2334,6 +2338,8 @@ static const IDEDMAOps ide_dma_nop_ops = { static void ide_restart_dma(IDEState *s, enum ide_dma_cmd dma_cmd) { s->unit = s->bus->retry_unit; + ide_set_sector(s, s->bus->retry_sector_num); + s->nsector = s->bus->retry_nsector; s->bus->dma->ops->restart_dma(s->bus->dma); s->io_buffer_index = 0; s->io_buffer_size = 0; diff --git a/hw/ide/internal.h b/hw/ide/internal.h index 9630f61..02206a9 100644 --- a/hw/ide/internal.h +++ b/hw/ide/internal.h @@ -465,6 +465,8 @@ struct IDEBus { int error_status; uint8_t retry_unit; + int64_t retry_sector_num; + uint32_t retry_nsector; }; #define TYPE_IDE_DEVICE "ide-device" diff --git a/hw/ide/pci.c b/hw/ide/pci.c index 2b0e886..fab2abc 100644 --- a/hw/ide/pci.c +++ b/hw/ide/pci.c @@ -46,8 +46,6 @@ static void bmdma_start_dma(IDEDMA *dma, IDEState *s, bm->cur_prd_last = 0; bm->cur_prd_addr = 0; bm->cur_prd_len = 0; - bm->sector_num = ide_get_sector(s); - bm->nsector = s->nsector; if (bm->status & BM_STATUS_DMAING) { bm->dma_cb(bmdma_active_if(bm), 0); @@ -177,10 +175,7 @@ static void bmdma_set_inactive(IDEDMA *dma, bool more) static void bmdma_restart_dma(IDEDMA *dma) { BMDMAState *bm = DO_UPCAST(BMDMAState, dma, dma); - IDEState *s = bmdma_active_if(bm); - ide_set_sector(s, bm->sector_num); - s->nsector = bm->nsector; bm->cur_addr = bm->addr; } @@ -207,8 +202,6 @@ static void bmdma_reset(IDEDMA *dma) bm->cur_prd_last = 0; bm->cur_prd_addr = 0; bm->cur_prd_len = 0; - bm->sector_num = 0; - bm->nsector = 0; } static void bmdma_irq(void *opaque, int n, int level) @@ -326,6 +319,8 @@ static void ide_bmdma_pre_save(void *opaque) uint8_t abused_bits = BM_MIGRATION_COMPAT_STATUS_BITS; bm->migration_retry_unit = bm->bus->retry_unit; + bm->migration_retry_sector_num = bm->bus->retry_sector_num; + bm->migration_retry_nsector = bm->bus->retry_nsector; bm->migration_compat_status = (bm->status & ~abused_bits) | (bm->bus->error_status & abused_bits); } @@ -343,6 +338,8 @@ static int ide_bmdma_post_load(void *opaque, int version_id) bm->bus->error_status |= bm->migration_compat_status & abused_bits; } if (bm->bus->error_status) { + bm->bus->retry_sector_num = bm->migration_retry_sector_num; + bm->bus->retry_nsector = bm->migration_retry_nsector; bm->bus->retry_unit = bm->migration_retry_unit; } @@ -381,8 +378,8 @@ static const VMStateDescription vmstate_bmdma = { VMSTATE_UINT8(cmd, BMDMAState), VMSTATE_UINT8(migration_compat_status, BMDMAState), VMSTATE_UINT32(addr, BMDMAState), - VMSTATE_INT64(sector_num, BMDMAState), - VMSTATE_UINT32(nsector, BMDMAState), + VMSTATE_INT64(migration_retry_sector_num, BMDMAState), + VMSTATE_UINT32(migration_retry_nsector, BMDMAState), VMSTATE_UINT8(migration_retry_unit, BMDMAState), VMSTATE_END_OF_LIST() }, diff --git a/hw/ide/pci.h b/hw/ide/pci.h index 222a163..0f2d4b9 100644 --- a/hw/ide/pci.h +++ b/hw/ide/pci.h @@ -22,10 +22,7 @@ typedef struct BMDMAState { uint32_t cur_prd_last; uint32_t cur_prd_addr; uint32_t cur_prd_len; - uint8_t unit; BlockCompletionFunc *dma_cb; - int64_t sector_num; - uint32_t nsector; MemoryRegion addr_ioport; MemoryRegion extra_io; qemu_irq irq; @@ -34,6 +31,8 @@ typedef struct BMDMAState { * Bit 3-6: bus->error_status */ uint8_t migration_compat_status; uint8_t migration_retry_unit; + int64_t migration_retry_sector_num; + uint32_t migration_retry_nsector; struct PCIIDEState *pci_dev; } BMDMAState; -- 2.1.0