diff --git a/hw/usb-ehci.c b/hw/usb-ehci.c index f806a20..218d590 100644 --- a/hw/usb-ehci.c +++ b/hw/usb-ehci.c @@ -981,13 +981,15 @@ err: qh->token |= QTD_TOKEN_HALT; break; case USB_RET_NAK: + /* 4.10.3 */ reload = get_field(qh->epchar, QH_EPCHAR_RL); if ((ehci->pid == USB_TOKEN_IN) && reload) { int nakcnt = get_field(qh->altnext_qtd, QH_ALTNEXT_NAKCNT); nakcnt--; set_field(&qh->altnext_qtd, nakcnt, QH_ALTNEXT_NAKCNT); + } else if (!reload) { + return USB_RET_NAK; } - return USB_RET_NAK; break; case USB_RET_BABBLE: fprintf(stderr, "USB babble TODO\n"); @@ -1040,7 +1042,7 @@ err: ret += ehci->more; - if (ret > ehci->tbytes) { + if ((ret > ehci->tbytes) && (ehci->pid == USB_TOKEN_IN)) { ret = USB_RET_BABBLE; goto err; }