Message ID | 1461321893-15811-1-git-send-email-kraxel@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 22 April 2016 at 11:44, Gerd Hoffmann <kraxel@redhat.com> wrote: > commit "5f77e06 usb: add pid check at the first of uhci_handle_td()" > moved the pid verification to the start of the uhci_handle_td function, > to simplify the error handling (we don't have to free stuff which we > didn't allocate in the first place ...). > > Problem is now the check fires too often, it raises error IRQs even for > TDs which we are not going to process because they are not set active. > > So, lets move down the check a bit, so it is done only for active TDs, > but still before we are going to allocate stuff to process the requested > transfer. > > Reported-by: Joe Clifford <joe@thunderbug.co.uk> > Tested-by: Joe Clifford <joe@thunderbug.co.uk> > Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Applied to master, thanks. -- PMM
diff --git a/hw/usb/hcd-uhci.c b/hw/usb/hcd-uhci.c index 18057bf..ca72a80 100644 --- a/hw/usb/hcd-uhci.c +++ b/hw/usb/hcd-uhci.c @@ -776,19 +776,6 @@ static int uhci_handle_td(UHCIState *s, UHCIQueue *q, uint32_t qh_addr, uint8_t pid = td->token & 0xff; UHCIAsync *async; - switch (pid) { - case USB_TOKEN_OUT: - case USB_TOKEN_SETUP: - case USB_TOKEN_IN: - break; - default: - /* invalid pid : frame interrupted */ - s->status |= UHCI_STS_HCPERR; - s->cmd &= ~UHCI_CMD_RS; - uhci_update_irq(s); - return TD_RESULT_STOP_FRAME; - } - async = uhci_async_find_td(s, td_addr); if (async) { if (uhci_queue_verify(async->queue, qh_addr, td, td_addr, queuing)) { @@ -828,6 +815,19 @@ static int uhci_handle_td(UHCIState *s, UHCIQueue *q, uint32_t qh_addr, return TD_RESULT_NEXT_QH; } + switch (pid) { + case USB_TOKEN_OUT: + case USB_TOKEN_SETUP: + case USB_TOKEN_IN: + break; + default: + /* invalid pid : frame interrupted */ + s->status |= UHCI_STS_HCPERR; + s->cmd &= ~UHCI_CMD_RS; + uhci_update_irq(s); + return TD_RESULT_STOP_FRAME; + } + if (async) { if (queuing) { /* we are busy filling the queue, we are not prepared