Skip to content

Commit

Permalink
ide: start extracting ide_restart_dma out of bmdma_restart_dma
Browse files Browse the repository at this point in the history
This patch begins refactoring the restart dma functions
out of bmdma to be shared with AHCI and other future
IDE HBA implementations.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: John Snow <jsnow@redhat.com>
Message-id: 1424708286-16483-2-git-send-email-jsnow@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
  • Loading branch information
bonzini authored and kevmw committed Mar 10, 2015
1 parent 0eb28a4 commit 06b95b1
Showing 1 changed file with 18 additions and 10 deletions.
28 changes: 18 additions & 10 deletions hw/ide/pci.c
Expand Up @@ -184,25 +184,32 @@ static void bmdma_set_inactive(IDEDMA *dma, bool more)
}
}

static void bmdma_restart_dma(BMDMAState *bm, enum ide_dma_cmd dma_cmd)
static void bmdma_restart_dma(BMDMAState *bm)
{
IDEState *s = bmdma_active_if(bm);

ide_set_sector(s, bm->sector_num);
s->nsector = bm->nsector;
bm->cur_addr = bm->addr;
}

static void ide_restart_dma(IDEState *s, enum ide_dma_cmd dma_cmd)
{
BMDMAState *bm = DO_UPCAST(BMDMAState, dma, s->bus->dma);

bmdma_restart_dma(bm);
s->io_buffer_index = 0;
s->io_buffer_size = 0;
s->nsector = bm->nsector;
s->dma_cmd = dma_cmd;
bm->cur_addr = bm->addr;
bm->dma_cb = ide_dma_cb;
bmdma_start_dma(&bm->dma, s, bm->dma_cb);
bmdma_start_dma(&bm->dma, s, ide_dma_cb);
}

/* TODO This should be common IDE code */
static void bmdma_restart_bh(void *opaque)
{
BMDMAState *bm = opaque;
IDEBus *bus = bm->bus;
IDEState *s;
bool is_read;
int error_status;

Expand All @@ -213,6 +220,7 @@ static void bmdma_restart_bh(void *opaque)
return;
}

s = bmdma_active_if(bm);
is_read = (bus->error_status & IDE_RETRY_READ) != 0;

/* The error status must be cleared before resubmitting the request: The
Expand All @@ -223,18 +231,18 @@ static void bmdma_restart_bh(void *opaque)

if (error_status & IDE_RETRY_DMA) {
if (error_status & IDE_RETRY_TRIM) {
bmdma_restart_dma(bm, IDE_DMA_TRIM);
ide_restart_dma(s, IDE_DMA_TRIM);
} else {
bmdma_restart_dma(bm, is_read ? IDE_DMA_READ : IDE_DMA_WRITE);
ide_restart_dma(s, is_read ? IDE_DMA_READ : IDE_DMA_WRITE);
}
} else if (error_status & IDE_RETRY_PIO) {
if (is_read) {
ide_sector_read(bmdma_active_if(bm));
ide_sector_read(s);
} else {
ide_sector_write(bmdma_active_if(bm));
ide_sector_write(s);
}
} else if (error_status & IDE_RETRY_FLUSH) {
ide_flush_cache(bmdma_active_if(bm));
ide_flush_cache(s);
} else {
IDEState *s = bmdma_active_if(bm);

Expand Down

0 comments on commit 06b95b1

Please sign in to comment.