0a122b
From 1d59e428d7754c0fc331092d265254a0b3473546 Mon Sep 17 00:00:00 2001
0a122b
From: Gerd Hoffmann <kraxel@redhat.com>
0a122b
Date: Wed, 11 Dec 2013 10:04:22 +0100
0a122b
Subject: [PATCH 1/5] xhci: add support for suspend/resume
0a122b
0a122b
RH-Author: Gerd Hoffmann <kraxel@redhat.com>
0a122b
Message-id: <1386756262-29763-2-git-send-email-kraxel@redhat.com>
0a122b
Patchwork-id: 56161
0a122b
O-Subject: [RHEL-7 qemu-kvm PATCH 1/1] xhci: add support for suspend/resume
0a122b
Bugzilla: 1012365
0a122b
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
0a122b
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
0a122b
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
0a122b
0a122b
The OS can ask the xhci controller to save and restore its
0a122b
internal state, which is used by the OS when the system is
0a122b
suspended and resumed.
0a122b
0a122b
This patch handles writes to the save + restore bits in the
0a122b
command register.  Only thing it does is updating the
0a122b
restore error bit in the status register to signal an error
0a122b
on restore.  The guest OS should do a full reinitialization
0a122b
after resume then.
0a122b
0a122b
This is the minimal patch which gets S3 going with xhci.
0a122b
Implementing full save/restore support is TBD.
0a122b
0a122b
https://bugzilla.redhat.com/show_bug.cgi?id=1012365
0a122b
0a122b
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
0a122b
(cherry picked from commit f1f8bc218a422081f36f0b325b3de5e6a5078b74)
0a122b
---
0a122b
 hw/usb/hcd-xhci.c | 8 ++++++++
0a122b
 1 file changed, 8 insertions(+)
0a122b
0a122b
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
0a122b
---
0a122b
 hw/usb/hcd-xhci.c |    8 ++++++++
0a122b
 1 files changed, 8 insertions(+), 0 deletions(-)
0a122b
0a122b
diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c
0a122b
index 9d7315f..87ba7af 100644
0a122b
--- a/hw/usb/hcd-xhci.c
0a122b
+++ b/hw/usb/hcd-xhci.c
0a122b
@@ -2976,6 +2976,14 @@ static void xhci_oper_write(void *ptr, hwaddr reg,
0a122b
         } else if (!(val & USBCMD_RS) && (xhci->usbcmd & USBCMD_RS)) {
0a122b
             xhci_stop(xhci);
0a122b
         }
0a122b
+        if (val & USBCMD_CSS) {
0a122b
+            /* save state */
0a122b
+            xhci->usbsts &= ~USBSTS_SRE;
0a122b
+        }
0a122b
+        if (val & USBCMD_CRS) {
0a122b
+            /* restore state */
0a122b
+            xhci->usbsts |= USBSTS_SRE;
0a122b
+        }
0a122b
         xhci->usbcmd = val & 0xc0f;
0a122b
         xhci_mfwrap_update(xhci);
0a122b
         if (val & USBCMD_HCRST) {
0a122b
-- 
0a122b
1.7.1
0a122b