From nobody Mon Feb 9 05:41:08 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1555661193; cv=none; d=zoho.com; s=zohoarc; b=EmThsVmjpQErOGIWh33/9/Aqj7Lbte29GXQ2eiHoL8dOXV9pKQY8R+An7N/uNlC6STdesTu/kH5wyYKAY1xlFVe1IUJyVEeYHJtYHazPxbJZUR+TlS4cCK8+9e0VrsEKy53aqtJYzJXWYNCuvNkJMpwir5CSwxh9JoxJ5nu8XJE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1555661193; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=S9Ura7/OBV0Rosyd5VYkMhYkRNvIPR0gbgxqG9kSy1Q=; b=AJLXkLiQSxiFIMOgSLlh4fKQ4CjJXU6iDEUBmFIMWed5PPAciQ0phRrm4826pXGwtWMk+5MVUorx8JvDoSxXdZewk1HyMzyUYqsCBjBYnSUPGn85BQhYGSb7IHikWTxOscDdJ9iLl9tI4QnYn98jdFbYTqywGPCzVl56i3NTRIM= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1555661193914946.2203097338046; Fri, 19 Apr 2019 01:06:33 -0700 (PDT) Received: from localhost ([127.0.0.1]:53024 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hHOXT-0006EH-NP for importer@patchew.org; Fri, 19 Apr 2019 04:06:27 -0400 Received: from eggs.gnu.org ([209.51.188.92]:54848) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hHOVF-0004pm-Ly for qemu-devel@nongnu.org; Fri, 19 Apr 2019 04:04:10 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hHONv-00075J-2T for qemu-devel@nongnu.org; Fri, 19 Apr 2019 03:56:36 -0400 Received: from mx1.redhat.com ([209.132.183.28]:38088) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hHONu-00074d-QS for qemu-devel@nongnu.org; Fri, 19 Apr 2019 03:56:34 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 016E889C39 for ; Fri, 19 Apr 2019 07:56:34 +0000 (UTC) Received: from thuth.com (ovpn-116-62.ams2.redhat.com [10.36.116.62]) by smtp.corp.redhat.com (Postfix) with ESMTP id EFA6A5D70A; Fri, 19 Apr 2019 07:56:32 +0000 (UTC) From: Thomas Huth To: qemu-devel@nongnu.org, Gerd Hoffmann Date: Fri, 19 Apr 2019 09:56:24 +0200 Message-Id: <20190419075625.24251-2-thuth@redhat.com> In-Reply-To: <20190419075625.24251-1-thuth@redhat.com> References: <20190419075625.24251-1-thuth@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Fri, 19 Apr 2019 07:56:34 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v2 for-4.1 1/2] hw/usb/hcd-ohci: Do not use PCI functions with sysbus devices in ohci_die() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Paolo Bonzini , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" The ohci_die() function always assumes to be running with a PCI OHCI controller and calls the PCI-specific functions pci_set_word(). However, this function might also get called for the sysbus OHCI devices, so it likely fails in that case. To fix this issue, change the code now, so that there are two implementations now, one for sysbus and one for PCI, and use the right function via a function pointer in the OHCIState structure. Signed-off-by: Thomas Huth --- hw/usb/hcd-ohci.c | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/hw/usb/hcd-ohci.c b/hw/usb/hcd-ohci.c index 81cf5ab7a5..6d3f556989 100644 --- a/hw/usb/hcd-ohci.c +++ b/hw/usb/hcd-ohci.c @@ -52,7 +52,7 @@ typedef struct OHCIPort { uint32_t ctrl; } OHCIPort; =20 -typedef struct { +typedef struct OHCIState { USBBus bus; qemu_irq irq; MemoryRegion mem; @@ -108,6 +108,7 @@ typedef struct { uint32_t async_td; bool async_complete; =20 + void (*ohci_die)(struct OHCIState *ohci); } OHCIState; =20 /* Host Controller Communications Area */ @@ -302,7 +303,10 @@ struct ohci_iso_td { =20 #define OHCI_HRESET_FSBIR (1 << 0) =20 -static void ohci_die(OHCIState *ohci); +static void ohci_die(OHCIState *ohci) +{ + ohci->ohci_die(ohci); +} =20 /* Update IRQ levels */ static inline void ohci_intr_update(OHCIState *ohci) @@ -1854,13 +1858,14 @@ static USBBusOps ohci_bus_ops =3D { =20 static void usb_ohci_init(OHCIState *ohci, DeviceState *dev, uint32_t num_ports, dma_addr_t localmem_base, - char *masterbus, uint32_t firstport, - AddressSpace *as, Error **errp) + char *masterbus, uint32_t firstport, AddressSpac= e *as, + void (*ohci_die_fn)(struct OHCIState *), Error *= *errp) { Error *err =3D NULL; int i; =20 ohci->as =3D as; + ohci->ohci_die =3D ohci_die_fn; =20 if (num_ports > OHCI_MAX_PORTS) { error_setg(errp, "OHCI num-ports=3D%u is too big (limit is %u port= s)", @@ -1933,18 +1938,28 @@ typedef struct { uint32_t firstport; } OHCIPCIState; =20 -/** A typical O/EHCI will stop operating, set itself into error state - * (which can be queried by MMIO) and will set PERR in its config - * space to signal that it got an error +/** + * A typical OHCI will stop operating and set itself into error state + * (which can be queried by MMIO) to signal that it got an error. */ -static void ohci_die(OHCIState *ohci) +static void ohci_sysbus_die(struct OHCIState *ohci) { - OHCIPCIState *dev =3D container_of(ohci, OHCIPCIState, state); - trace_usb_ohci_die(); =20 ohci_set_interrupt(ohci, OHCI_INTR_UE); ohci_bus_stop(ohci); +} + +/** + * A typical PCI OHCI will additionally set PERR in its configspace to + * signal that it got an error. + */ +static void ohci_pci_die(struct OHCIState *ohci) +{ + OHCIPCIState *dev =3D container_of(ohci, OHCIPCIState, state); + + ohci_sysbus_die(ohci); + pci_set_word(dev->parent_obj.config + PCI_STATUS, PCI_STATUS_DETECTED_PARITY); } @@ -1959,7 +1974,7 @@ static void usb_ohci_realize_pci(PCIDevice *dev, Erro= r **errp) =20 usb_ohci_init(&ohci->state, DEVICE(dev), ohci->num_ports, 0, ohci->masterbus, ohci->firstport, - pci_get_address_space(dev), &err); + pci_get_address_space(dev), ohci_pci_die, &err); if (err) { error_propagate(errp, err); return; @@ -2023,7 +2038,7 @@ static void ohci_realize_pxa(DeviceState *dev, Error = **errp) =20 usb_ohci_init(&s->ohci, dev, s->num_ports, s->dma_offset, s->masterbus, s->firstport, - &address_space_memory, &err); + &address_space_memory, ohci_sysbus_die, &err); if (err) { error_propagate(errp, err); return; --=20 2.21.0