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;
         }
