From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:47895) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R5yCX-0005JQ-3V for qemu-devel@nongnu.org; Tue, 20 Sep 2011 07:09:22 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1R5yCQ-00006u-BB for qemu-devel@nongnu.org; Tue, 20 Sep 2011 07:09:20 -0400 Received: from mx1.redhat.com ([209.132.183.28]:18880) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R5yCP-00006l-Ul for qemu-devel@nongnu.org; Tue, 20 Sep 2011 07:09:14 -0400 From: Kevin Wolf Date: Tue, 20 Sep 2011 13:11:45 +0200 Message-Id: <1316517112-9908-14-git-send-email-kwolf@redhat.com> In-Reply-To: <1316517112-9908-1-git-send-email-kwolf@redhat.com> References: <1316517112-9908-1-git-send-email-kwolf@redhat.com> Subject: [Qemu-devel] [PATCH 13/20] AHCI Port Interrupt Enable register cleaning on soft reset List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: anthony@codemonkey.ws Cc: kwolf@redhat.com, qemu-devel@nongnu.org From: Alexander Motin I've found that FreeBSD AHCI driver doesn't work with AHCI hardware emulation of QEMU 0.15.0. I believe the problem is on QEMU's side. As I see, it clears port's Interrupt Enable register each time when reset of any level happens. Is is reasonable for the global controller reset. It is probably not good, but acceptable for FreeBSD driver for the port hard reset. But it is IMO wrong for the device soft reset. None of real hardware I know behaves that way. Signed-off-by: Alexander Motin Signed-off-by: Kevin Wolf --- hw/ide/ahci.c | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-) diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c index a8659cf..464c28b 100644 --- a/hw/ide/ahci.c +++ b/hw/ide/ahci.c @@ -499,10 +499,7 @@ static void ahci_reset_port(AHCIState *s, int port) ide_bus_reset(&d->port); ide_state->ncq_queues = AHCI_MAX_CMDS; - pr->irq_stat = 0; - pr->irq_mask = 0; pr->scr_stat = 0; - pr->scr_ctl = 0; pr->scr_err = 0; pr->scr_act = 0; d->busy_slot = -1; @@ -1159,12 +1156,17 @@ void ahci_uninit(AHCIState *s) void ahci_reset(void *opaque) { struct AHCIPCIState *d = opaque; + AHCIPortRegs *pr; int i; d->ahci.control_regs.irqstatus = 0; d->ahci.control_regs.ghc = 0; for (i = 0; i < d->ahci.ports; i++) { + pr = &d->ahci.dev[i].port_regs; + pr->irq_stat = 0; + pr->irq_mask = 0; + pr->scr_ctl = 0; ahci_reset_port(&d->ahci, i); } } -- 1.7.6.2