mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 16:53:55 -06:00
usb: fix port reset
commit 891fb2cd45
removed the implicit
detach before (re-)attaching in usb_attach(). Some usb host controllers
used that behavior though to do a port reset by a detach+attach
sequence.
This patch establishes old behavior by adding a new usb_reset() function
for port resets and putting it into use, thereby also unifying port
reset behavior of all host controllers. The patch also adds asserts to
usb_attach() and usb_detach() to make sure the calls are symmetrical.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
3393bc105d
commit
e0b8e72dd9
5 changed files with 17 additions and 4 deletions
12
hw/usb.c
12
hw/usb.c
|
@ -33,6 +33,7 @@ void usb_attach(USBPort *port)
|
|||
|
||||
assert(dev != NULL);
|
||||
assert(dev->attached);
|
||||
assert(dev->state == USB_STATE_NOTATTACHED);
|
||||
port->ops->attach(port);
|
||||
usb_send_msg(dev, USB_MSG_ATTACH);
|
||||
}
|
||||
|
@ -42,10 +43,21 @@ void usb_detach(USBPort *port)
|
|||
USBDevice *dev = port->dev;
|
||||
|
||||
assert(dev != NULL);
|
||||
assert(dev->state != USB_STATE_NOTATTACHED);
|
||||
port->ops->detach(port);
|
||||
usb_send_msg(dev, USB_MSG_DETACH);
|
||||
}
|
||||
|
||||
void usb_reset(USBPort *port)
|
||||
{
|
||||
USBDevice *dev = port->dev;
|
||||
|
||||
assert(dev != NULL);
|
||||
usb_detach(port);
|
||||
usb_attach(port);
|
||||
usb_send_msg(dev, USB_MSG_RESET);
|
||||
}
|
||||
|
||||
void usb_wakeup(USBDevice *dev)
|
||||
{
|
||||
if (dev->remote_wakeup && dev->port && dev->port->ops->wakeup) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue