Index: uspace/drv/bus/usb/xhci/commands.c
===================================================================
--- uspace/drv/bus/usb/xhci/commands.c	(revision 4cc0c2e0b29341ba5dfe06af584148b2b1de044b)
+++ uspace/drv/bus/usb/xhci/commands.c	(revision ed8575f8584c50f2fbc1f481eede55f9dc3e86a8)
@@ -746,4 +746,10 @@
 	case XHCI_TRBC_USB_TRANSACTION_ERROR:
 		return ESTALL;
+	case XHCI_TRBC_RESOURCE_ERROR:
+	case XHCI_TRBC_BANDWIDTH_ERROR:
+	case XHCI_TRBC_NO_SLOTS_ERROR:
+		return ELIMIT;
+	case XHCI_TRBC_SLOT_NOT_ENABLED_ERROR:
+		return ENOENT;
 	default:
 		return EINVAL;
Index: uspace/drv/bus/usb/xhci/hc.c
===================================================================
--- uspace/drv/bus/usb/xhci/hc.c	(revision 4cc0c2e0b29341ba5dfe06af584148b2b1de044b)
+++ uspace/drv/bus/usb/xhci/hc.c	(revision ed8575f8584c50f2fbc1f481eede55f9dc3e86a8)
@@ -893,9 +893,19 @@
 int hc_stop_endpoint(xhci_hc_t *hc, uint32_t slot_id, uint8_t ep_idx)
 {
-
 	return xhci_cmd_sync_inline(hc, STOP_ENDPOINT, .slot_id = slot_id, .endpoint_id = ep_idx);
 }
 
 /**
+ * Instruct xHC to reset halted endpoint.
+ *
+ * @param slot_id Slot ID assigned to the device.
+ * @param ep_idx Endpoint index (number + direction) in question
+ */
+int hc_reset_endpoint(xhci_hc_t *hc, uint32_t slot_id, uint8_t ep_idx)
+{
+	return xhci_cmd_sync_inline(hc, RESET_ENDPOINT, .slot_id = slot_id, .endpoint_id = ep_idx);
+}
+
+/**
  * @}
  */
Index: uspace/drv/bus/usb/xhci/hc.h
===================================================================
--- uspace/drv/bus/usb/xhci/hc.h	(revision 4cc0c2e0b29341ba5dfe06af584148b2b1de044b)
+++ uspace/drv/bus/usb/xhci/hc.h	(revision ed8575f8584c50f2fbc1f481eede55f9dc3e86a8)
@@ -120,4 +120,5 @@
 int hc_update_endpoint(xhci_hc_t *, uint32_t, uint8_t, xhci_ep_ctx_t *);
 int hc_stop_endpoint(xhci_hc_t *, uint32_t , uint8_t);
+int hc_reset_endpoint(xhci_hc_t *, uint32_t , uint8_t);
 
 int hc_status(bus_t *, uint32_t *);
Index: uspace/drv/bus/usb/xhci/transfers.c
===================================================================
--- uspace/drv/bus/usb/xhci/transfers.c	(revision 4cc0c2e0b29341ba5dfe06af584148b2b1de044b)
+++ uspace/drv/bus/usb/xhci/transfers.c	(revision ed8575f8584c50f2fbc1f481eede55f9dc3e86a8)
@@ -351,4 +351,42 @@
 			break;
 
+		case XHCI_TRBC_DATA_BUFFER_ERROR:
+			usb_log_warning("Transfer ended with data buffer error.");
+			batch->error = EAGAIN;
+			batch->transfered_size = 0;
+			break;
+
+		case XHCI_TRBC_BABBLE_DETECTED_ERROR:
+			usb_log_warning("Babble detected during the transfer. Resetting endpoint.");
+			batch->error = EAGAIN;
+			batch->transfered_size = 0;
+			hc_reset_endpoint(hc, slot_id, ep_dci);
+			break;
+
+		case XHCI_TRBC_USB_TRANSACTION_ERROR:
+			usb_log_warning("USB Transaction error. Resetting endpoint.");
+			batch->error = ESTALL;
+			batch->transfered_size = 0;
+			hc_reset_endpoint(hc, slot_id, ep_dci);
+			break;
+
+		case XHCI_TRBC_TRB_ERROR:
+			usb_log_error("Invalid transfer parameters.");
+			batch->error = EINVAL;
+			batch->transfered_size = 0;
+			break;
+
+		case XHCI_TRBC_STALL_ERROR:
+			usb_log_warning("Stall condition detected.");
+			batch->error = ESTALL;
+			batch->transfered_size = 0;
+			break;
+
+		case XHCI_TRBC_SPLIT_TRANSACTION_ERROR:
+			usb_log_error("Split transcation error detected.");
+			batch->error = EAGAIN;
+			batch->transfered_size = 0;
+			break;
+
 		default:
 			usb_log_warning("Transfer not successfull: %u", completion_code);
