Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757989AbdCUQQ5 (ORCPT ); Tue, 21 Mar 2017 12:16:57 -0400 Received: from iolanthe.rowland.org ([192.131.102.54]:32962 "HELO iolanthe.rowland.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S933293AbdCUQPz (ORCPT ); Tue, 21 Mar 2017 12:15:55 -0400 Date: Tue, 21 Mar 2017 12:15:53 -0400 (EDT) From: Alan Stern X-X-Sender: stern@iolanthe.rowland.org To: Gerd Hoffmann cc: linux-usb@vger.kernel.org, Greg Kroah-Hartman , open list Subject: Re: [PATCH v2] ohci-pci: add qemu quirk In-Reply-To: <1489997509-14996-1-git-send-email-kraxel@redhat.com> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3107 Lines: 81 On Mon, 20 Mar 2017, Gerd Hoffmann wrote: > 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 > --- > 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(-) > > diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c > index b6daf2e..5f81a2b 100644 > --- a/drivers/usb/host/ohci-hcd.c > +++ b/drivers/usb/host/ohci-hcd.c > @@ -231,7 +231,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); > diff --git a/drivers/usb/host/ohci-pci.c b/drivers/usb/host/ohci-pci.c > index bb15096..a84aebe 100644 > --- 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_hcd *hcd) > 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 int ohci_quirk_amd700(struct usb_hcd *hcd) > 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. > diff --git a/drivers/usb/host/ohci.h b/drivers/usb/host/ohci.h > index 37f1725..a51b189 100644 > --- 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 Signed-off-by: Alan Stern