diff options
author | John Snow <jsnow@redhat.com> | 2015-07-04 02:06:04 -0400 |
---|---|---|
committer | John Snow <jsnow@redhat.com> | 2015-07-04 02:06:04 -0400 |
commit | 54f3223730736fca1e6e89bb7f99c4f8432fdabb (patch) | |
tree | 50ee5219067196a45399ba138d9c2389d2113d72 /hw/ide/ahci.c | |
parent | 631ddc22cbb401f2777dc8b117196f0988df4eea (diff) |
ahci: factor ncq_finish out of ncq_cb
When we add werror=stop or rerror=stop support to NCQ,
we'll want to take a codepath where we don't actually
complete the command, so factor that out into a new routine.
Signed-off-by: John Snow <jsnow@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Message-id: 1435767578-32743-6-git-send-email-jsnow@redhat.com
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) |