diff options
author | Hans de Goede <hdegoede@redhat.com> | 2011-06-24 12:31:11 +0200 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2011-07-05 15:09:02 +0200 |
commit | 4706ab6cc0af86d3f38806664420cc3eb8999bd9 (patch) | |
tree | 53ca1a3df6c81e2eb309b431f01825496ea4692a /hw/usb-hub.c | |
parent | d47e59b8b8adc96a2052f7e004cb12b6ff62edd9 (diff) |
usb: Replace device_destroy bus op with a child_detach port op
Note this fixes 2 things in one go, first of all the device_destroy bus
op should be a device_detach bus op, as pending async packets from the
device should be cancelled on detach not on destroy.
Secondly having this as a bus op won't work with companion controllers, since
then there will be 1 bus driven by the ehci controller and thus 1 set of bus
ops, but the device being detached may be downstream of a handed over port.
Making the detach of a downstream device a port op allows the ehci controller
to forward this to the companion controller port for handed over ports.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Diffstat (limited to 'hw/usb-hub.c')
-rw-r--r-- | hw/usb-hub.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/hw/usb-hub.c b/hw/usb-hub.c index d324bbad8e..b7557cea56 100644 --- a/hw/usb-hub.c +++ b/hw/usb-hub.c @@ -238,6 +238,9 @@ static void usb_hub_detach(USBPort *port1) USBHubState *s = port1->opaque; USBHubPort *port = &s->ports[port1->index]; + /* Let upstream know the device on this port is gone */ + s->dev.port->ops->child_detach(s->dev.port, port1->dev); + port->wPortStatus &= ~PORT_STAT_CONNECTION; port->wPortChange |= PORT_STAT_C_CONNECTION; if (port->wPortStatus & PORT_STAT_ENABLE) { @@ -246,6 +249,14 @@ static void usb_hub_detach(USBPort *port1) } } +static void usb_hub_child_detach(USBPort *port1, USBDevice *child) +{ + USBHubState *s = port1->opaque; + + /* Pass along upstream */ + s->dev.port->ops->child_detach(s->dev.port, child); +} + static void usb_hub_wakeup(USBPort *port1) { USBHubState *s = port1->opaque; @@ -537,6 +548,7 @@ static void usb_hub_handle_destroy(USBDevice *dev) static USBPortOps usb_hub_port_ops = { .attach = usb_hub_attach, .detach = usb_hub_detach, + .child_detach = usb_hub_child_detach, .wakeup = usb_hub_wakeup, .complete = usb_hub_complete, }; |