From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44657) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z7Bxt-0005yS-LS for qemu-devel@nongnu.org; Mon, 22 Jun 2015 20:21:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Z7Bxs-0003VV-L2 for qemu-devel@nongnu.org; Mon, 22 Jun 2015 20:21:25 -0400 From: John Snow Date: Mon, 22 Jun 2015 20:21:04 -0400 Message-Id: <1435018875-22527-6-git-send-email-jsnow@redhat.com> In-Reply-To: <1435018875-22527-1-git-send-email-jsnow@redhat.com> References: <1435018875-22527-1-git-send-email-jsnow@redhat.com> Subject: [Qemu-devel] [PATCH 05/16] ahci: factor ncq_finish out of ncq_cb List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-block@nongnu.org Cc: kwolf@redhat.com, pbonzini@redhat.com, John Snow , qemu-devel@nongnu.org, stefanha@redhat.com 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 --- hw/ide/ahci.c | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c index 4f8cceb..71b5085 100644 --- a/hw/ide/ahci.c +++ b/hw/ide/ahci.c @@ -933,23 +933,11 @@ static void ncq_err(NCQTransferState *ncq_tfs) ncq_tfs->drive->port_regs.scr_err |= (1 << ncq_tfs->tag); } -static void ncq_cb(void *opaque, int ret) +static void ncq_finish(NCQTransferState *ncq_tfs) { - NCQTransferState *ncq_tfs = (NCQTransferState *)opaque; - IDEState *ide_state = &ncq_tfs->drive->port.ifs[0]; - - 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); - } else { - ide_state->status = READY_STAT | SEEK_STAT; - } - ahci_write_fis_sdb(ncq_tfs->drive->hba, ncq_tfs->drive->port_no, (1 << ncq_tfs->tag)); @@ -962,6 +950,24 @@ static void ncq_cb(void *opaque, int ret) ncq_tfs->used = 0; } +static void ncq_cb(void *opaque, int ret) +{ + NCQTransferState *ncq_tfs = (NCQTransferState *)opaque; + IDEState *ide_state = &ncq_tfs->drive->port.ifs[0]; + + if (ret == -ECANCELED) { + return; + } + + if (ret < 0) { + ncq_err(ncq_tfs); + } else { + ide_state->status = READY_STAT | SEEK_STAT; + } + + ncq_finish(ncq_tfs); +} + static int is_ncq(uint8_t ata_cmd) { /* Based on SATA 3.2 section 13.6.3.2 */ -- 2.1.0