summaryrefslogtreecommitdiff
path: root/hw/usb/hcd-xhci.c
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2012-10-26 10:22:37 +0200
committerGerd Hoffmann <kraxel@redhat.com>2012-11-01 13:10:09 +0100
commit40030130d167f2bf762155a1a7e0073de5545e8b (patch)
treef9549d87a77cc591ce48ccc6fdc24b6696273dc3 /hw/usb/hcd-xhci.c
parentf705a362800733c363f0458f75942f8dc61b7abb (diff)
downloadqemu-40030130d167f2bf762155a1a7e0073de5545e8b.tar.gz
xhci: add xhci_port_reset
Move port reset logic to its own function. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Diffstat (limited to 'hw/usb/hcd-xhci.c')
-rw-r--r--hw/usb/hcd-xhci.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c
index 3af463986d..1db803cda9 100644
--- a/hw/usb/hcd-xhci.c
+++ b/hw/usb/hcd-xhci.c
@@ -2387,6 +2387,13 @@ static void xhci_port_update(XHCIPort *port, int is_detach)
xhci_port_notify(port, PORTSC_CSC);
}
+static void xhci_port_reset(XHCIPort *port)
+{
+ DPRINTF("xhci: port %d reset\n", port);
+ usb_device_reset(port->uport->dev);
+ port->portsc |= PORTSC_PRC | PORTSC_PED;
+}
+
static void xhci_reset(DeviceState *dev)
{
XHCIState *xhci = DO_UPCAST(XHCIState, pci_dev.qdev, dev);
@@ -2549,13 +2556,11 @@ static void xhci_port_write(void *ptr, hwaddr reg,
/* read/write bits */
portsc &= ~(PORTSC_PP|PORTSC_WCE|PORTSC_WDE|PORTSC_WOE);
portsc |= (val & (PORTSC_PP|PORTSC_WCE|PORTSC_WDE|PORTSC_WOE));
+ port->portsc = portsc;
/* write-1-to-start bits */
if (val & PORTSC_PR) {
- DPRINTF("xhci: port %d reset\n", port);
- usb_device_reset(port->uport->dev);
- portsc |= PORTSC_PRC | PORTSC_PED;
+ xhci_port_reset(port);
}
- port->portsc = portsc;
break;
case 0x04: /* PORTPMSC */
case 0x08: /* PORTLI */