Index: uspace/drv/bus/usb/xhci/commands.c
===================================================================
--- uspace/drv/bus/usb/xhci/commands.c	(revision c362127ff86c6ba802ca5edd6ed8582d9fd08ff9)
+++ uspace/drv/bus/usb/xhci/commands.c	(revision 5ac5eb1755bd526b807249739af614929831d5a4)
@@ -81,5 +81,15 @@
 	trb.control |= host2xhci(32, hc->command_ring.pcs);
 
-	// TODO: Setup input control context.
+	return enqueue_trb(hc, &trb, 0, 0);
+}
+
+int xhci_send_disable_slot_command(xhci_hc_t *hc, uint32_t slot_id)
+{
+	xhci_trb_t trb;
+	memset(&trb, 0, sizeof(trb));
+
+	trb.control = host2xhci(32, XHCI_TRB_TYPE_DISABLE_SLOT_CMD << 10);
+	trb.control |= host2xhci(32, hc->command_ring.pcs);
+	trb.control |= host2xhci(32, slot_id << 24);
 
 	return enqueue_trb(hc, &trb, 0, 0);
@@ -88,25 +98,32 @@
 int xhci_handle_command_completion(xhci_hc_t *hc, xhci_trb_t *trb)
 {
-	usb_log_debug2("HC(%p) Command completed.", hc);
+	usb_log_debug("HC(%p) Command completed.", hc);
 	xhci_dump_trb(trb);
 
-	int code = XHCI_DWORD_EXTRACT(trb->status, 31, 24);
+	int code;
+	uint32_t slot_id;
+	xhci_trb_t *command;
 
-	xhci_trb_t *command = (xhci_trb_t *) XHCI_QWORD_EXTRACT(trb->parameter, 63, 4);
+	code = XHCI_DWORD_EXTRACT(trb->status, 31, 24);
+	command = (xhci_trb_t *) XHCI_QWORD_EXTRACT(trb->parameter, 63, 4);
+	slot_id = XHCI_DWORD_EXTRACT(trb->control, 31, 24);
+	(void) slot_id;
 
-	switch(TRB_TYPE(*command)) {
+	switch (TRB_TYPE(*command)) {
 	case XHCI_TRB_TYPE_NO_OP_CMD:
 		assert(code == XHCI_TRBC_TRB_ERROR);
 		break;
 	case XHCI_TRB_TYPE_ENABLE_SLOT_CMD:
-	{
-		uint32_t slot_id = XHCI_DWORD_EXTRACT(trb->control, 31, 24);
-		(void) slot_id;
 		// TODO: Call a device addition callback once it's implemented.
-		//       Also check for a suitable type of the slot id.
 		break;
-	}
+	case XHCI_TRB_TYPE_DISABLE_SLOT_CMD:
+		if (code == XHCI_TRBC_SLOT_NOT_ENABLED_ERROR)
+			usb_log_debug2("Slot ID to be disabled was not enabled.");
+		// TODO: Call a device removal callback that will deallocate associated
+		//       data structures once it's implemented.
+		break;
 	default:
-		usb_log_warning("HC(%p) Command of an unsupported type has been completed.", hc);
+		usb_log_debug2("Unsupported command trb.");
+		xhci_dump_trb(command);
 		break;
 	}
Index: uspace/drv/bus/usb/xhci/commands.h
===================================================================
--- uspace/drv/bus/usb/xhci/commands.h	(revision c362127ff86c6ba802ca5edd6ed8582d9fd08ff9)
+++ uspace/drv/bus/usb/xhci/commands.h	(revision 5ac5eb1755bd526b807249739af614929831d5a4)
@@ -42,4 +42,5 @@
 int xhci_send_no_op_command(xhci_hc_t *);
 int xhci_send_enable_slot_command(xhci_hc_t *);
+int xhci_send_disable_slot_command(xhci_hc_t *, uint32_t);
 
 int xhci_handle_command_completion(xhci_hc_t *, xhci_trb_t *);
Index: uspace/drv/bus/usb/xhci/hc.c
===================================================================
--- uspace/drv/bus/usb/xhci/hc.c	(revision c362127ff86c6ba802ca5edd6ed8582d9fd08ff9)
+++ uspace/drv/bus/usb/xhci/hc.c	(revision 5ac5eb1755bd526b807249739af614929831d5a4)
@@ -360,5 +360,5 @@
 static void hc_handle_event(xhci_hc_t *hc, xhci_trb_t *trb)
 {
-	switch(TRB_TYPE(*trb)) {
+	switch (TRB_TYPE(*trb)) {
 		case XHCI_TRB_TYPE_COMMAND_COMPLETION_EVENT:
 			xhci_handle_command_completion(hc, trb);
