diff --git a/devicemodel/hw/pci/xhci.c b/devicemodel/hw/pci/xhci.c index 709445c1d..869fc6eba 100644 --- a/devicemodel/hw/pci/xhci.c +++ b/devicemodel/hw/pci/xhci.c @@ -2173,10 +2173,19 @@ pci_xhci_xfer_complete(struct pci_xhci_vdev *xdev, XHCI_ST_EPCTX_HALTED; err = XHCI_TRB_ERROR_STALL; break; + case USB_ERR_SHORT_XFER: + err = XHCI_TRB_ERROR_SHORT_PKT; + break; + case USB_ERR_TIMEOUT: + case USB_ERR_IOERROR: + err = XHCI_TRB_ERROR_XACT; + break; + case USB_ERR_BAD_BUFSIZE: + err = XHCI_TRB_ERROR_BABBLE; + break; case USB_ERR_NORMAL_COMPLETION: break; default: - /* FIXME: should process other failures */ UPRINTF(LFTL, "unknown error %d\r\n", xfer->status); } diff --git a/devicemodel/hw/platform/usb_pmapper.c b/devicemodel/hw/platform/usb_pmapper.c index c9d8b2ef1..96e1718b4 100644 --- a/devicemodel/hw/platform/usb_pmapper.c +++ b/devicemodel/hw/platform/usb_pmapper.c @@ -62,13 +62,21 @@ usb_dev_comp_req(struct libusb_transfer *libusb_xfer) xfer->status = USB_ERR_STALLED; goto out; case LIBUSB_TRANSFER_NO_DEVICE: + /* avoid short packet warnings when devices are plugged out. */ + xfer->status = USB_ERR_SHORT_XFER; + goto out; case LIBUSB_TRANSFER_ERROR: - case LIBUSB_TRANSFER_TIMED_OUT: + xfer->status = USB_ERR_STALLED; + goto out; case LIBUSB_TRANSFER_CANCELLED: + xfer->status = USB_ERR_IOERROR; + goto out; + case LIBUSB_TRANSFER_TIMED_OUT: + xfer->status = USB_ERR_TIMEOUT; + goto out; case LIBUSB_TRANSFER_OVERFLOW: - /* FIXME: should treat every failure properly */ - UPRINTF(LWRN, "failure: %x\r\n", libusb_xfer->status); - break; + xfer->status = USB_ERR_BAD_BUFSIZE; + goto out; case LIBUSB_TRANSFER_COMPLETED: break; default: