218e99
From d8c698663916222fea36f660f0e56a23a8688afc Mon Sep 17 00:00:00 2001
218e99
From: Gerd Hoffmann <kraxel@redhat.com>
218e99
Date: Wed, 6 Nov 2013 12:16:58 +0100
218e99
Subject: [PATCH 63/81] usb-host-libusb: Fix reset handling
218e99
218e99
RH-Author: Gerd Hoffmann <kraxel@redhat.com>
218e99
Message-id: <1383740220-2049-2-git-send-email-kraxel@redhat.com>
218e99
Patchwork-id: 55513
218e99
O-Subject: [RHEL-7 qemu-kvm PATCH 1/3] usb-host-libusb: Fix reset handling
218e99
Bugzilla: 980415
218e99
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
218e99
RH-Acked-by: Bandan Das <bsd@redhat.com>
218e99
RH-Acked-by: Alex Williamson <alex.williamson@redhat.com>
218e99
218e99
From: Hans de Goede <hdegoede@redhat.com>
218e99
218e99
The guest will issue an initial device reset when the device is attached, but
218e99
since the current usb-host-libusb code only actually does the reset when
218e99
udev->configuration != 0, and on attach the device is not yet configured,
218e99
the reset gets ignored. This means that the device gets passed to the guest
218e99
in an unknown state, which is not good.
218e99
218e99
The udev->configuration check is there because of the release / claim
218e99
interfaces done around the libusb_device_reset call, but these are not
218e99
necessary. If interfaces are claimed when libusb_device_reset gets called
218e99
libusb will release + reclaim them itself.
218e99
218e99
The usb_host_ep_update call also is not necessary. If the reset succeeds the
218e99
original config and interface alt settings will be restored.
218e99
218e99
Last if the reset fails, that means the device has either disconnected or
218e99
morphed into an another device and has been completely re-enumerated,
218e99
so it is treated by the host as a new device and our handle is invalid,
218e99
so on reset failure we need to call usb_host_nodev().
218e99
218e99
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
218e99
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
218e99
(cherry picked from commit 5af35d7feccaa7d26b72c6c3d14116421d736b36)
218e99
---
218e99
 hw/usb/host-libusb.c | 10 ++++------
218e99
 1 file changed, 4 insertions(+), 6 deletions(-)
218e99
218e99
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
218e99
---
218e99
 hw/usb/host-libusb.c |   10 ++++------
218e99
 1 files changed, 4 insertions(+), 6 deletions(-)
218e99
218e99
diff --git a/hw/usb/host-libusb.c b/hw/usb/host-libusb.c
218e99
index f660770..9c8905e 100644
218e99
--- a/hw/usb/host-libusb.c
218e99
+++ b/hw/usb/host-libusb.c
218e99
@@ -1256,16 +1256,14 @@ static void usb_host_flush_ep_queue(USBDevice *dev, USBEndpoint *ep)
218e99
 static void usb_host_handle_reset(USBDevice *udev)
218e99
 {
218e99
     USBHostDevice *s = USB_HOST_DEVICE(udev);
218e99
+    int rc;
218e99
 
218e99
     trace_usb_host_reset(s->bus_num, s->addr);
218e99
 
218e99
-    if (udev->configuration == 0) {
218e99
-        return;
218e99
+    rc = libusb_reset_device(s->dh);
218e99
+    if (rc != 0) {
218e99
+        usb_host_nodev(s);
218e99
     }
218e99
-    usb_host_release_interfaces(s);
218e99
-    libusb_reset_device(s->dh);
218e99
-    usb_host_claim_interfaces(s, 0);
218e99
-    usb_host_ep_update(s);
218e99
 }
218e99
 
218e99
 /*
218e99
-- 
218e99
1.7.1
218e99