diff options
Diffstat (limited to 'hw/ide/ahci.c')
-rw-r--r-- | hw/ide/ahci.c | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c index b3a6a91dbb..b0b9b41ed0 100644 --- a/hw/ide/ahci.c +++ b/hw/ide/ahci.c @@ -933,6 +933,23 @@ static void ncq_err(NCQTransferState *ncq_tfs) ncq_tfs->drive->port_regs.scr_err |= (1 << ncq_tfs->tag); } +static void ncq_finish(NCQTransferState *ncq_tfs) +{ + /* Clear bit for this tag in SActive */ + ncq_tfs->drive->port_regs.scr_act &= ~(1 << ncq_tfs->tag); + + ahci_write_fis_sdb(ncq_tfs->drive->hba, ncq_tfs->drive->port_no, + (1 << ncq_tfs->tag)); + + DPRINTF(ncq_tfs->drive->port_no, "NCQ transfer tag %d finished\n", + ncq_tfs->tag); + + block_acct_done(blk_get_stats(ncq_tfs->drive->port.ifs[0].blk), + &ncq_tfs->acct); + qemu_sglist_destroy(&ncq_tfs->sglist); + ncq_tfs->used = 0; +} + static void ncq_cb(void *opaque, int ret) { NCQTransferState *ncq_tfs = (NCQTransferState *)opaque; @@ -941,8 +958,6 @@ static void ncq_cb(void *opaque, int ret) if (ret == -ECANCELED) { return; } - /* Clear bit for this tag in SActive */ - ncq_tfs->drive->port_regs.scr_act &= ~(1 << ncq_tfs->tag); if (ret < 0) { ncq_err(ncq_tfs); @@ -950,16 +965,7 @@ static void ncq_cb(void *opaque, int ret) ide_state->status = READY_STAT | SEEK_STAT; } - ahci_write_fis_sdb(ncq_tfs->drive->hba, ncq_tfs->drive->port_no, - (1 << ncq_tfs->tag)); - - DPRINTF(ncq_tfs->drive->port_no, "NCQ transfer tag %d finished\n", - ncq_tfs->tag); - - block_acct_done(blk_get_stats(ncq_tfs->drive->port.ifs[0].blk), - &ncq_tfs->acct); - qemu_sglist_destroy(&ncq_tfs->sglist); - ncq_tfs->used = 0; + ncq_finish(ncq_tfs); } static int is_ncq(uint8_t ata_cmd) |