diff options
| author | Gerd Hoffmann <kraxel@redhat.com> | 2019-05-24 09:03:09 +0200 |
|---|---|---|
| committer | Gerd Hoffmann <kraxel@redhat.com> | 2019-05-29 07:04:05 +0200 |
| commit | 638ac2d8437b7600262bc584e3634f1aaca732cf (patch) | |
| tree | 394058c56aaf7e93fe3e8f7288f1524c38c945de /hw/usb/dev-hub.c | |
| parent | 868a420393e1231be75d12a3d0df67f3c466a56a (diff) | |
| download | focaccia-qemu-638ac2d8437b7600262bc584e3634f1aaca732cf.tar.gz focaccia-qemu-638ac2d8437b7600262bc584e3634f1aaca732cf.zip | |
usb-hub: add usb_hub_port_update()
Helper function to update port status bits which depends on the connected device. We need the same logic for device attach and port reset, so factor it out. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com> Message-id: 20190524070310.4952-5-kraxel@redhat.com
Diffstat (limited to 'hw/usb/dev-hub.c')
| -rw-r--r-- | hw/usb/dev-hub.c | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/hw/usb/dev-hub.c b/hw/usb/dev-hub.c index 1cc92a5f9a..29f4d6723e 100644 --- a/hw/usb/dev-hub.c +++ b/hw/usb/dev-hub.c @@ -188,18 +188,28 @@ static bool usb_hub_port_clear(USBHubPort *port, uint16_t status) return usb_hub_port_change(port, status); } +static bool usb_hub_port_update(USBHubPort *port) +{ + bool notify = false; + + if (port->port.dev && port->port.dev->attached) { + notify = usb_hub_port_set(port, PORT_STAT_CONNECTION); + if (port->port.dev->speed == USB_SPEED_LOW) { + usb_hub_port_set(port, PORT_STAT_LOW_SPEED); + } else { + usb_hub_port_clear(port, PORT_STAT_LOW_SPEED); + } + } + return notify; +} + static void usb_hub_attach(USBPort *port1) { USBHubState *s = port1->opaque; USBHubPort *port = &s->ports[port1->index]; trace_usb_hub_attach(s->dev.addr, port1->index + 1); - usb_hub_port_set(port, PORT_STAT_CONNECTION); - if (port->port.dev->speed == USB_SPEED_LOW) { - usb_hub_port_set(port, PORT_STAT_LOW_SPEED); - } else { - usb_hub_port_clear(port, PORT_STAT_LOW_SPEED); - } + usb_hub_port_update(port); usb_wakeup(s->intr, 0); } @@ -287,12 +297,7 @@ static void usb_hub_handle_reset(USBDevice *dev) port->wPortStatus = 0; port->wPortChange = 0; usb_hub_port_set(port, PORT_STAT_POWER); - if (port->port.dev && port->port.dev->attached) { - usb_hub_port_set(port, PORT_STAT_CONNECTION); - if (port->port.dev->speed == USB_SPEED_LOW) { - usb_hub_port_set(port, PORT_STAT_LOW_SPEED); - } - } + usb_hub_port_update(port); } } |