summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Graf2011-02-01 15:51:30 +0100
committerKevin Wolf2011-02-07 11:38:57 +0100
commit760c3e44d3a1d8a7e9d22f0429b1805d1c688178 (patch)
tree1d21499b67afd2bad54fac97072d59d447535368
parentahci: send init d2h fis on fis enable (diff)
downloadqemu-760c3e44d3a1d8a7e9d22f0429b1805d1c688178.tar.gz
qemu-760c3e44d3a1d8a7e9d22f0429b1805d1c688178.tar.xz
qemu-760c3e44d3a1d8a7e9d22f0429b1805d1c688178.zip
ahci: Implement HBA reset
The ahci code was missing its soft reset functionality. This wasn't really an issue for Linux guests, but Windows gets confused when the controller doesn't reset when it tells it so. Using this patch I can now successfully boot Windows 7 from AHCI using AHCI enabled SeaBIOS. Signed-off-by: Alexander Graf <agraf@suse.de> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
-rw-r--r--hw/ide/ahci.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c
index e6ac77c678..105dd53916 100644
--- a/hw/ide/ahci.c
+++ b/hw/ide/ahci.c
@@ -335,7 +335,7 @@ static void ahci_mem_writel(void *ptr, target_phys_addr_t addr, uint32_t val)
case HOST_CTL: /* R/W */
if (val & HOST_CTL_RESET) {
DPRINTF(-1, "HBA Reset\n");
- /* FIXME reset? */
+ ahci_reset(container_of(s, AHCIPCIState, ahci));
} else {
s->control_regs.ghc = (val & 0x3) | HOST_CTL_AHCI_EN;
ahci_check_irq(s);
@@ -1134,6 +1134,9 @@ void ahci_reset(void *opaque)
struct AHCIPCIState *d = opaque;
int i;
+ d->ahci.control_regs.irqstatus = 0;
+ d->ahci.control_regs.ghc = 0;
+
for (i = 0; i < SATA_PORTS; i++) {
ahci_reset_port(&d->ahci, i);
}