Index: uspace/drv/bus/usb/xhci/commands.c
===================================================================
--- uspace/drv/bus/usb/xhci/commands.c	(revision e9e24f2146ae218d9e3b86ddb7e1f84ec3f2a506)
+++ uspace/drv/bus/usb/xhci/commands.c	(revision a0be5d09918a5ace86ecb87efdf8a4042077764d)
@@ -145,12 +145,4 @@
 }
 
-static inline int ring_doorbell(xhci_hc_t *hc, unsigned doorbell, unsigned target)
-{
-	assert(hc);
-	uint32_t v = host2xhci(32, target & BIT_RRANGE(uint32_t, 7));
-	pio_write_32(&hc->db_arry[doorbell], v);
-	return EOK;
-}
-
 static inline int enqueue_command(xhci_hc_t *hc, xhci_cmd_t *cmd, unsigned doorbell, unsigned target)
 {
@@ -161,5 +153,5 @@
 
 	xhci_trb_ring_enqueue(&hc->command_ring, &cmd->trb, &cmd->trb_phys);
-	ring_doorbell(hc, doorbell, target);
+	hc_ring_doorbell(hc, doorbell, target);
 
 	usb_log_debug2("HC(%p): Sent command:", hc);
@@ -196,5 +188,5 @@
 
 	XHCI_REG_WR(hc->op_regs, XHCI_OP_CRR, 1);
-	ring_doorbell(hc, 0, 0);
+	hc_ring_doorbell(hc, 0, 0);
 }
 
Index: uspace/drv/bus/usb/xhci/hc.c
===================================================================
--- uspace/drv/bus/usb/xhci/hc.c	(revision e9e24f2146ae218d9e3b86ddb7e1f84ec3f2a506)
+++ uspace/drv/bus/usb/xhci/hc.c	(revision a0be5d09918a5ace86ecb87efdf8a4042077764d)
@@ -457,4 +457,9 @@
 		batch->buffer_size);
 
+	if (!batch->ep->address) {
+		usb_log_error("Attempted to schedule transfer to address 0.");
+		return EINVAL;
+	}
+
 	switch (batch->ep->transfer_type) {
 	case USB_TRANSFER_CONTROL:
@@ -616,5 +621,11 @@
 }
 
-
+int hc_ring_doorbell(xhci_hc_t *hc, unsigned doorbell, unsigned target)
+{
+	assert(hc);
+	uint32_t v = host2xhci(32, target & BIT_RRANGE(uint32_t, 7));
+	pio_write_32(&hc->db_arry[doorbell], v);
+	return EOK;
+}
 
 /**
Index: uspace/drv/bus/usb/xhci/hc.h
===================================================================
--- uspace/drv/bus/usb/xhci/hc.h	(revision e9e24f2146ae218d9e3b86ddb7e1f84ec3f2a506)
+++ uspace/drv/bus/usb/xhci/hc.h	(revision a0be5d09918a5ace86ecb87efdf8a4042077764d)
@@ -90,4 +90,5 @@
 void hc_interrupt(xhci_hc_t *, uint32_t);
 void hc_fini(xhci_hc_t *);
+int hc_ring_doorbell(xhci_hc_t *, unsigned, unsigned);
 
 #endif
Index: uspace/drv/bus/usb/xhci/transfers.c
===================================================================
--- uspace/drv/bus/usb/xhci/transfers.c	(revision e9e24f2146ae218d9e3b86ddb7e1f84ec3f2a506)
+++ uspace/drv/bus/usb/xhci/transfers.c	(revision a0be5d09918a5ace86ecb87efdf8a4042077764d)
@@ -41,12 +41,4 @@
 #include "trb_ring.h"
 
-static inline int ring_doorbell(xhci_hc_t *hc, unsigned doorbell, unsigned target)
-{
-	assert(hc);
-	uint32_t v = host2xhci(32, target & BIT_RRANGE(uint32_t, 7));
-	pio_write_32(&hc->db_arry[doorbell], v);
-	return EOK;
-}
-
 static inline uint8_t get_transfer_type(xhci_trb_t* trb, uint8_t bmRequestType, uint16_t wLength)
 {
@@ -143,8 +135,10 @@
 {
 	if (!batch->setup_size) {
+		usb_log_error("Missing setup packet for the control transfer.");
 		return EINVAL;
 	}
 	if (batch->ep->endpoint != 0 || batch->ep->transfer_type != USB_TRANSFER_CONTROL) {
 		/* This method only works for control transfers. */
+		usb_log_error("Attempted to schedule control transfer to non 0 endpoint.");
 		return EINVAL;
 	}
@@ -223,5 +217,5 @@
 
  	/* For control transfers, the target is always 1. */
- 	ring_doorbell(hc, slot_id, 1);
+ 	hc_ring_doorbell(hc, slot_id, 1);
 	return EOK;
 }
