Hi, I will take over this and fix it
Best, Qiang On Tue, Sep 27, 2022 at 9:11 AM Stefan Hajnoczi <stefa...@gmail.com> wrote: > On Mon, 26 Sept 2022 at 06:29, Gerd Hoffmann <kra...@redhat.com> wrote: > > > > From: Qiang Liu <cyruscy...@gmail.com> > > > > I found an assertion failure in usb_cancel_packet() and posted my > analysis in > > https://gitlab.com/qemu-project/qemu/-/issues/1180. I think this issue > is > > because the inconsistency when resetting ohci root hubs. > > > > There are two ways to reset ohci root hubs: 1) through HcRhPortStatus, 2) > > through HcControl. However, when the packet's status is USB_PACKET_ASYNC, > > resetting through HcRhPortStatus will complete the packet and thus > resetting > > through HcControl will fail. That is because IMO resetting through > > HcRhPortStatus should first detach the port and then invoked > usb_device_reset() > > just like through HcControl. Therefore, I change usb_device_reset() to > > usb_port_reset() where usb_detach() and usb_device_reset() are invoked > > consequently. > > > > Fixes: d28f4e2d8631 ("usb: kill USB_MSG_RESET") > > Reported-by: Qiang Liu <cyruscy...@gmail.com> > > Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1180 > > Signed-off-by: Qiang Liu <cyruscy...@gmail.com> > > Message-Id: <20220830033022.1164961-1-cyruscy...@gmail.com> > > Signed-off-by: Gerd Hoffmann <kra...@redhat.com> > > --- > > hw/usb/hcd-ohci.c | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > This commit breaks boot-serial-test on ppc64-softmmu. > > $ ./configure --enable-tcg-interpreter > '--target-list=aarch64-softmmu alpha-softmmu arm-softmmu hppa-softmmu > m68k-softmmu microblaze-softmmu ppc64-softmmu s390x-softmmu > x86_64-softmmu' > $ make && cd build && QTEST_QEMU_BINARY=./qemu-system-ppc64 > ./tests/qtest/boot-serial-test; cd - > > (Yes, the full --target-list is needed because boot-serial-test isn't > built when only ppc64-softmmu is selected.) > > Here is the CI failure: > https://gitlab.com/qemu-project/qemu/-/jobs/3087540972#L22 > > Stefan > > > > > diff --git a/hw/usb/hcd-ohci.c b/hw/usb/hcd-ohci.c > > index 72bdde92617c..28d703481515 100644 > > --- a/hw/usb/hcd-ohci.c > > +++ b/hw/usb/hcd-ohci.c > > @@ -1436,7 +1436,7 @@ static void ohci_port_set_status(OHCIState *ohci, > int portnum, uint32_t val) > > > > if (ohci_port_set_if_connected(ohci, portnum, val & OHCI_PORT_PRS)) > { > > trace_usb_ohci_port_reset(portnum); > > - usb_device_reset(port->port.dev); > > + usb_port_reset(&port->port); > > port->ctrl &= ~OHCI_PORT_PRS; > > /* ??? Should this also set OHCI_PORT_PESC. */ > > port->ctrl |= OHCI_PORT_PES | OHCI_PORT_PRSC; > > -- > > 2.37.3 > > > > >