}
 
        out += sprintf(out, "%s%s", ptype, (urbp->fsbr ? " FSBR" : ""));
-       out += sprintf(out, " Actlen=%d", urbp->urb->actual_length);
+       out += sprintf(out, " Actlen=%d%s", urbp->urb->actual_length,
+                       (urbp->qh->type == USB_ENDPOINT_XFER_CONTROL ?
+                               "-8" : ""));
 
        if (urbp->urb->unlinked)
                out += sprintf(out, " Unlinked=%d", urbp->urb->unlinked);
 
        }
        if (qh->state != QH_STATE_ACTIVE)
                qh->skel = skel;
-
-       urb->actual_length = -8;        /* Account for the SETUP packet */
        return 0;
 
 nomem:
 
        if (qh->type == USB_ENDPOINT_XFER_CONTROL) {
 
-               /* urb->actual_length < 0 means the setup transaction didn't
-                * complete successfully.  Either it failed or the URB was
-                * unlinked first.  Regardless, don't confuse people with a
-                * negative length. */
-               urb->actual_length = max(urb->actual_length, 0);
+               /* Subtract off the length of the SETUP packet from
+                * urb->actual_length.
+                */
+               urb->actual_length -= min_t(u32, 8, urb->actual_length);
        }
 
        /* When giving back the first URB in an Isochronous queue,