+++ /dev/null
-From 21a60f6e65181cad64fd66ccc8080d413721ba27 Mon Sep 17 00:00:00 2001
-From: Gerd Hoffmann <kraxel@redhat.com>
-Date: Mon, 20 Mar 2017 09:11:49 +0100
-Subject: ohci-pci: add qemu quirk
-
-From: Gerd Hoffmann <kraxel@redhat.com>
-
-commit 21a60f6e65181cad64fd66ccc8080d413721ba27 upstream.
-
-On a loaded virtualization host (dozen guests booting at the same time)
-it may happen that the ohci controller emulation doesn't manage to do
-timely frame processing, with the result that the io watchdog fires and
-considers the controller being dead, even though it's only the emulation
-being unusual slow due to the load peak.
-
-So, add a quirk for qemu and don't use the watchdog in case we figure we
-are running on emulated ohci. The virtual ohci controller masquerades
-as apple ohci controller, but we can identify it by subsystem id.
-
-Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
-Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-
----
- drivers/usb/host/ohci-hcd.c | 3 ++-
- drivers/usb/host/ohci-pci.c | 16 ++++++++++++++++
- drivers/usb/host/ohci.h | 1 +
- 3 files changed, 19 insertions(+), 1 deletion(-)
-
---- a/drivers/usb/host/ohci-hcd.c
-+++ b/drivers/usb/host/ohci-hcd.c
-@@ -230,7 +230,8 @@ static int ohci_urb_enqueue (
-
- /* Start up the I/O watchdog timer, if it's not running */
- if (!timer_pending(&ohci->io_watchdog) &&
-- list_empty(&ohci->eds_in_use)) {
-+ list_empty(&ohci->eds_in_use) &&
-+ !(ohci->flags & OHCI_QUIRK_QEMU)) {
- ohci->prev_frame_no = ohci_frame_no(ohci);
- mod_timer(&ohci->io_watchdog,
- jiffies + IO_WATCHDOG_DELAY);
---- a/drivers/usb/host/ohci-pci.c
-+++ b/drivers/usb/host/ohci-pci.c
-@@ -164,6 +164,15 @@ static int ohci_quirk_amd700(struct usb_
- return 0;
- }
-
-+static int ohci_quirk_qemu(struct usb_hcd *hcd)
-+{
-+ struct ohci_hcd *ohci = hcd_to_ohci(hcd);
-+
-+ ohci->flags |= OHCI_QUIRK_QEMU;
-+ ohci_dbg(ohci, "enabled qemu quirk\n");
-+ return 0;
-+}
-+
- /* List of quirks for OHCI */
- static const struct pci_device_id ohci_pci_quirks[] = {
- {
-@@ -214,6 +223,13 @@ static const struct pci_device_id ohci_p
- PCI_DEVICE(PCI_VENDOR_ID_ATI, 0x4399),
- .driver_data = (unsigned long)ohci_quirk_amd700,
- },
-+ {
-+ .vendor = PCI_VENDOR_ID_APPLE,
-+ .device = 0x003f,
-+ .subvendor = PCI_SUBVENDOR_ID_REDHAT_QUMRANET,
-+ .subdevice = PCI_SUBDEVICE_ID_QEMU,
-+ .driver_data = (unsigned long)ohci_quirk_qemu,
-+ },
-
- /* FIXME for some of the early AMD 760 southbridges, OHCI
- * won't work at all. blacklist them.
---- a/drivers/usb/host/ohci.h
-+++ b/drivers/usb/host/ohci.h
-@@ -418,6 +418,7 @@ struct ohci_hcd {
- #define OHCI_QUIRK_AMD_PLL 0x200 /* AMD PLL quirk*/
- #define OHCI_QUIRK_AMD_PREFETCH 0x400 /* pre-fetch for ISO transfer */
- #define OHCI_QUIRK_GLOBAL_SUSPEND 0x800 /* must suspend ports */
-+#define OHCI_QUIRK_QEMU 0x1000 /* relax timing expectations */
-
- // there are also chip quirks/bugs in init logic
-