Index: uspace/app/usbinfo/info.c
===================================================================
--- uspace/app/usbinfo/info.c	(revision 1cbfd6b0e80bcc9b36186ad5f99dc9b0f0b68ff7)
+++ uspace/app/usbinfo/info.c	(revision 4acf099b70c331292c191767acea76db03805008)
@@ -294,4 +294,49 @@
 }
 
+
+void dump_status(usbinfo_device_t *dev)
+{
+	int rc;
+	uint16_t device_status = 0;
+	uint16_t ctrl_pipe_status = 0;
+
+	/* Device status first. */
+	rc = usb_request_get_status(&dev->ctrl_pipe,
+	    USB_REQUEST_RECIPIENT_DEVICE, 0,
+	    &device_status);
+	if (rc != EOK) {
+		printf("%sFailed to get device status: %s.\n",
+		    get_indent(0), str_error(rc));
+		goto try_ctrl_pipe_status;
+	}
+
+	printf("%sDevice status 0x%04x: power=%s, remote-wakeup=%s.\n",
+	    get_indent(0),
+	    device_status,
+	    device_status & USB_DEVICE_STATUS_SELF_POWERED ? "self" : "bus",
+	    device_status & USB_DEVICE_STATUS_REMOTE_WAKEUP ? "yes" : "no");
+
+	/* Interface is not interesting, skipping ;-). */
+
+	/* Control endpoint zero. */
+try_ctrl_pipe_status:
+	rc = usb_request_get_status(&dev->ctrl_pipe,
+	    USB_REQUEST_RECIPIENT_ENDPOINT, 0,
+	    &ctrl_pipe_status);
+	if (rc != EOK) {
+		printf("%sFailed to get control endpoint status: %s.\n",
+		    get_indent(0), str_error(rc));
+		goto leave;
+	}
+
+	printf("%sControl endpoint zero status %04X: halted=%s.\n",
+	    get_indent(0),
+	    ctrl_pipe_status,
+	    ctrl_pipe_status & USB_ENDPOINT_STATUS_HALTED ? "yes" : "no");
+
+leave:
+	return;
+}
+
 /** @}
  */
Index: uspace/app/usbinfo/main.c
===================================================================
--- uspace/app/usbinfo/main.c	(revision 1cbfd6b0e80bcc9b36186ad5f99dc9b0f0b68ff7)
+++ uspace/app/usbinfo/main.c	(revision 4acf099b70c331292c191767acea76db03805008)
@@ -136,4 +136,5 @@
 	_OPTION("-T --descriptor-tree-full", "Print detailed descriptor tree");
 	_OPTION("-s --strings", "Try to print all string descriptors.");
+	_OPTION("-S --status", "Get status of the device.");
 
 	printf("\n");
@@ -152,7 +153,8 @@
 	{"descriptor-tree-full", no_argument, NULL, 'T'},
 	{"strings", no_argument, NULL, 's'},
+	{"status", no_argument, NULL, 'S'},
 	{0, 0, NULL, 0}
 };
-static const char *short_options = "himtTs";
+static const char *short_options = "himtTsS";
 
 static usbinfo_action_t actions[] = {
@@ -180,4 +182,9 @@
 		.opt = 's',
 		.action = dump_strings,
+		.active = false
+	},
+	{
+		.opt = 'S',
+		.action = dump_status,
 		.active = false
 	},
Index: uspace/app/usbinfo/usbinfo.h
===================================================================
--- uspace/app/usbinfo/usbinfo.h	(revision 1cbfd6b0e80bcc9b36186ad5f99dc9b0f0b68ff7)
+++ uspace/app/usbinfo/usbinfo.h	(revision 4acf099b70c331292c191767acea76db03805008)
@@ -84,4 +84,5 @@
 void dump_descriptor_tree_full(usbinfo_device_t *);
 void dump_strings(usbinfo_device_t *);
+void dump_status(usbinfo_device_t *);
 
 
Index: uspace/drv/ohci/main.c
===================================================================
--- uspace/drv/ohci/main.c	(revision 1cbfd6b0e80bcc9b36186ad5f99dc9b0f0b68ff7)
+++ uspace/drv/ohci/main.c	(revision 4acf099b70c331292c191767acea76db03805008)
@@ -149,14 +149,21 @@
 	}
 
+
 	bool interrupts = false;
+#ifdef CONFIG_USBHC_NO_INTERRUPTS
+	usb_log_warning("Interrupts disabled in OS config, " \
+	    "falling back to polling.\n");
+#else
 	ret = pci_enable_interrupts(device);
 	if (ret != EOK) {
-		usb_log_warning(
-		    "Failed(%d) to enable interrupts, fall back to polling.\n",
-		    ret);
+		usb_log_warning("Failed to enable interrupts: %s.\n",
+		    str_error(ret));
+		usb_log_info("HW interrupts not available, " \
+		    "falling back to polling.\n");
 	} else {
 		usb_log_debug("Hw interrupts enabled.\n");
 		interrupts = true;
 	}
+#endif
 
 	ret = hc_init(hcd, hc_fun, device, mem_reg_base, mem_reg_size, interrupts);
Index: uspace/drv/uhci-hcd/batch.c
===================================================================
--- uspace/drv/uhci-hcd/batch.c	(revision 1cbfd6b0e80bcc9b36186ad5f99dc9b0f0b68ff7)
+++ uspace/drv/uhci-hcd/batch.c	(revision 4acf099b70c331292c191767acea76db03805008)
@@ -48,5 +48,5 @@
 	qh_t *qh;
 	td_t *tds;
-	size_t packets;
+	size_t transfers;
 	usb_device_keeper_t *manager;
 } uhci_batch_t;
@@ -64,5 +64,5 @@
  * @param[in] target Device and endpoint target of the transaction.
  * @param[in] transfer_type Interrupt, Control or Bulk.
- * @param[in] max_packet_size maximum allowed size of data packets.
+ * @param[in] max_packet_size maximum allowed size of data transfers.
  * @param[in] speed Speed of the transaction.
  * @param[in] buffer Data source/destination.
@@ -77,5 +77,5 @@
  * NULL otherwise.
  *
- * Determines the number of needed packets (TDs). Prepares a transport buffer
+ * Determines the number of needed transfers (TDs). Prepares a transport buffer
  * (that is accessible by the hardware). Initializes parameters needed for the
  * transaction and callback.
@@ -117,13 +117,13 @@
 	instance->private_data = data;
 
-	data->packets = (buffer_size + max_packet_size - 1) / max_packet_size;
+	data->transfers = (buffer_size + max_packet_size - 1) / max_packet_size;
 	if (transfer_type == USB_TRANSFER_CONTROL) {
-		data->packets += 2;
-	}
-
-	data->tds = malloc32(sizeof(td_t) * data->packets);
+		data->transfers += 2;
+	}
+
+	data->tds = malloc32(sizeof(td_t) * data->transfers);
 	CHECK_NULL_DISPOSE_RETURN(
 	    data->tds, "Failed to allocate transfer descriptors.\n");
-	bzero(data->tds, sizeof(td_t) * data->packets);
+	bzero(data->tds, sizeof(td_t) * data->transfers);
 
 	data->qh = malloc32(sizeof(qh_t));
@@ -166,9 +166,9 @@
 	assert(data);
 
-	usb_log_debug2("Batch(%p) checking %d packet(s) for completion.\n",
-	    instance, data->packets);
+	usb_log_debug2("Batch(%p) checking %d transfer(s) for completion.\n",
+	    instance, data->transfers);
 	instance->transfered_size = 0;
 	size_t i = 0;
-	for (;i < data->packets; ++i) {
+	for (;i < data->transfers; ++i) {
 		if (td_is_active(&data->tds[i])) {
 			return false;
@@ -298,8 +298,8 @@
  *
  * @param[in] instance Batch structure to use.
- * @param[in] pid to use for data packets.
+ * @param[in] pid Pid to use for data transfers.
  *
  * Packets with alternating toggle bit and supplied pid value.
- * The last packet is marked with IOC flag.
+ * The last transfer is marked with IOC flag.
  */
 void batch_data(usb_transfer_batch_t *instance, usb_packet_id pid)
@@ -314,5 +314,5 @@
 	assert(toggle == 0 || toggle == 1);
 
-	size_t packet = 0;
+	size_t transfer = 0;
 	size_t remain_size = instance->buffer_size;
 	while (remain_size > 0) {
@@ -325,21 +325,21 @@
 		    remain_size : instance->max_packet_size;
 
-		td_t *next_packet = (packet + 1 < data->packets)
-		    ? &data->tds[packet + 1] : NULL;
-
-		assert(packet < data->packets);
+		td_t *next_transfer = (transfer + 1 < data->transfers)
+		    ? &data->tds[transfer + 1] : NULL;
+
+		assert(transfer < data->transfers);
 		assert(packet_size <= remain_size);
 
 		td_init(
-		    &data->tds[packet], DEFAULT_ERROR_COUNT, packet_size,
+		    &data->tds[transfer], DEFAULT_ERROR_COUNT, packet_size,
 		    toggle, false, low_speed, instance->target, pid, trans_data,
-		    next_packet);
+		    next_transfer);
 
 
 		toggle = 1 - toggle;
 		remain_size -= packet_size;
-		++packet;
-	}
-	td_set_ioc(&data->tds[packet - 1]);
+		++transfer;
+	}
+	td_set_ioc(&data->tds[transfer - 1]);
 	usb_device_keeper_set_toggle(data->manager, instance->target,
 	    instance->direction, toggle);
@@ -349,11 +349,11 @@
  *
  * @param[in] instance Batch structure to use.
- * @param[in] data_stage to use for data packets.
- * @param[in] status_stage to use for data packets.
+ * @param[in] data_stage Pid to use for data transfers.
+ * @param[in] status_stage Pid to use for data transfers.
  *
  * Setup stage with toggle 0 and USB_PID_SETUP.
  * Data stage with alternating toggle and pid supplied by parameter.
  * Status stage with toggle 1 and pid supplied by parameter.
- * The last packet is marked with IOC.
+ * The last transfer is marked with IOC.
  */
 void batch_control(usb_transfer_batch_t *instance,
@@ -363,5 +363,5 @@
 	uhci_batch_t *data = instance->private_data;
 	assert(data);
-	assert(data->packets >= 2);
+	assert(data->transfers >= 2);
 
 	const bool low_speed = instance->speed == USB_SPEED_LOW;
@@ -374,5 +374,5 @@
 
 	/* data stage */
-	size_t packet = 1;
+	size_t transfer = 1;
 	size_t remain_size = instance->buffer_size;
 	while (remain_size > 0) {
@@ -388,10 +388,10 @@
 
 		td_init(
-		    &data->tds[packet], DEFAULT_ERROR_COUNT, packet_size,
+		    &data->tds[transfer], DEFAULT_ERROR_COUNT, packet_size,
 		    toggle, false, low_speed, instance->target, data_stage,
-		    control_data, &data->tds[packet + 1]);
-
-		++packet;
-		assert(packet < data->packets);
+		    control_data, &data->tds[transfer + 1]);
+
+		++transfer;
+		assert(transfer < data->transfers);
 		assert(packet_size <= remain_size);
 		remain_size -= packet_size;
@@ -399,13 +399,13 @@
 
 	/* status stage */
-	assert(packet == data->packets - 1);
+	assert(transfer == data->transfers - 1);
 
 	td_init(
-	    &data->tds[packet], DEFAULT_ERROR_COUNT, 0, 1, false, low_speed,
+	    &data->tds[transfer], DEFAULT_ERROR_COUNT, 0, 1, false, low_speed,
 	    instance->target, status_stage, NULL, NULL);
-	td_set_ioc(&data->tds[packet]);
+	td_set_ioc(&data->tds[transfer]);
 
 	usb_log_debug2("Control last TD status: %x.\n",
-	    data->tds[packet].status);
+	    data->tds[transfer].status);
 }
 /*----------------------------------------------------------------------------*/
Index: uspace/drv/uhci-hcd/hc.c
===================================================================
--- uspace/drv/uhci-hcd/hc.c	(revision 1cbfd6b0e80bcc9b36186ad5f99dc9b0f0b68ff7)
+++ uspace/drv/uhci-hcd/hc.c	(revision 4acf099b70c331292c191767acea76db03805008)
@@ -67,5 +67,5 @@
 static int hc_debug_checker(void *arg);
 
-static bool allowed_usb_packet(
+static bool usb_is_allowed(
     bool low_speed, usb_transfer_type_t transfer, size_t size);
 /*----------------------------------------------------------------------------*/
@@ -323,8 +323,8 @@
 	assert(batch);
 	const int low_speed = (batch->speed == USB_SPEED_LOW);
-	if (!allowed_usb_packet(
+	if (!usb_is_allowed(
 	    low_speed, batch->transfer_type, batch->max_packet_size)) {
 		usb_log_warning(
-		    "Invalid USB packet specified %s SPEED %d %zu.\n",
+		    "Invalid USB transfer specified %s SPEED %d %zu.\n",
 		    low_speed ? "LOW" : "FULL" , batch->transfer_type,
 		    batch->max_packet_size);
@@ -471,12 +471,12 @@
 }
 /*----------------------------------------------------------------------------*/
-/** Check transfer packets, for USB validity
+/** Check transfers for USB validity
  *
  * @param[in] low_speed Transfer speed.
  * @param[in] transfer Transer type
- * @param[in] size Maximum size of used packets
+ * @param[in] size Size of data packets
  * @return True if transaction is allowed by USB specs, false otherwise
  */
-bool allowed_usb_packet(
+bool usb_is_allowed(
     bool low_speed, usb_transfer_type_t transfer, size_t size)
 {
Index: uspace/drv/uhci-hcd/hw_struct/transfer_descriptor.h
===================================================================
--- uspace/drv/uhci-hcd/hw_struct/transfer_descriptor.h	(revision 1cbfd6b0e80bcc9b36186ad5f99dc9b0f0b68ff7)
+++ uspace/drv/uhci-hcd/hw_struct/transfer_descriptor.h	(revision 4acf099b70c331292c191767acea76db03805008)
@@ -108,9 +108,9 @@
 }
 /*----------------------------------------------------------------------------*/
-/** Check whether less than max data were recieved and packet is marked as SPD.
+/** Check whether less than max data were received on SPD marked transfer.
  *
  * @param[in] instance TD structure to use.
- * @return True if packet is short (less than max bytes and SPD set), false
- *     otherwise.
+ * @return True if data packet is short (less than max bytes and SPD set),
+ * false otherwise.
  */
 static inline bool td_is_short(td_t *instance)
Index: uspace/drv/uhci-hcd/iface.c
===================================================================
--- uspace/drv/uhci-hcd/iface.c	(revision 1cbfd6b0e80bcc9b36186ad5f99dc9b0f0b68ff7)
+++ uspace/drv/uhci-hcd/iface.c	(revision 4acf099b70c331292c191767acea76db03805008)
@@ -279,6 +279,6 @@
  * @param[in] target USB device to write to.
  * @param[in] max_packet_size maximum size of data packet the device accepts.
- * @param[in] setup_data Data to send with SETUP packet.
- * @param[in] setup_size Size of data to send with SETUP packet (should be 8B).
+ * @param[in] setup_data Data to send with SETUP transfer.
+ * @param[in] setup_size Size of data to send with SETUP transfer (always 8B).
  * @param[in] data Source of data.
  * @param[in] size Size of data source.
Index: uspace/drv/uhci-hcd/transfer_list.c
===================================================================
--- uspace/drv/uhci-hcd/transfer_list.c	(revision 1cbfd6b0e80bcc9b36186ad5f99dc9b0f0b68ff7)
+++ uspace/drv/uhci-hcd/transfer_list.c	(revision 4acf099b70c331292c191767acea76db03805008)
@@ -91,5 +91,6 @@
  * The batch is added to the end of the list and queue.
  */
-void transfer_list_add_batch(transfer_list_t *instance, usb_transfer_batch_t *batch)
+void transfer_list_add_batch(
+    transfer_list_t *instance, usb_transfer_batch_t *batch)
 {
 	assert(instance);
@@ -146,5 +147,6 @@
 	while (current != &instance->batch_list) {
 		link_t *next = current->next;
-		usb_transfer_batch_t *batch = list_get_instance(current, usb_transfer_batch_t, link);
+		usb_transfer_batch_t *batch =
+		    list_get_instance(current, usb_transfer_batch_t, link);
 
 		if (batch_is_complete(batch)) {
@@ -160,5 +162,6 @@
 		link_t *item = done.next;
 		list_remove(item);
-		usb_transfer_batch_t *batch = list_get_instance(item, usb_transfer_batch_t, link);
+		usb_transfer_batch_t *batch =
+		    list_get_instance(item, usb_transfer_batch_t, link);
 		batch->next_step(batch);
 	}
@@ -174,5 +177,6 @@
 	while (!list_empty(&instance->batch_list)) {
 		link_t *current = instance->batch_list.next;
-		usb_transfer_batch_t *batch = list_get_instance(current, usb_transfer_batch_t, link);
+		usb_transfer_batch_t *batch =
+		    list_get_instance(current, usb_transfer_batch_t, link);
 		transfer_list_remove_batch(instance, batch);
 		usb_transfer_batch_finish(batch, EIO);
@@ -189,5 +193,6 @@
  * Does not lock the transfer list, caller is responsible for that.
  */
-void transfer_list_remove_batch(transfer_list_t *instance, usb_transfer_batch_t *batch)
+void transfer_list_remove_batch(
+    transfer_list_t *instance, usb_transfer_batch_t *batch)
 {
 	assert(instance);
@@ -210,5 +215,6 @@
 	} else {
 		usb_transfer_batch_t *prev =
-		    list_get_instance(batch->link.prev, usb_transfer_batch_t, link);
+		    list_get_instance(
+		        batch->link.prev, usb_transfer_batch_t, link);
 		assert((batch_qh(prev)->next & LINK_POINTER_ADDRESS_MASK)
 		    == addr_to_phys(batch_qh(batch)));
Index: uspace/drv/uhci-hcd/uhci.c
===================================================================
--- uspace/drv/uhci-hcd/uhci.c	(revision 1cbfd6b0e80bcc9b36186ad5f99dc9b0f0b68ff7)
+++ uspace/drv/uhci-hcd/uhci.c	(revision 4acf099b70c331292c191767acea76db03805008)
@@ -175,13 +175,19 @@
 
 	bool interrupts = false;
+#ifdef CONFIG_USBHC_NO_INTERRUPTS
+	usb_log_warning("Interrupts disabled in OS config, " \
+	    "falling back to polling.\n");
+#else
 	ret = pci_enable_interrupts(device);
 	if (ret != EOK) {
-		usb_log_warning(
-		    "Failed(%d) to enable interrupts, fall back to polling.\n",
-		    ret);
+		usb_log_warning("Failed to enable interrupts: %s.\n",
+		    str_error(ret));
+		usb_log_info("HW interrupts not available, " \
+		    "falling back to polling.\n");
 	} else {
 		usb_log_debug("Hw interrupts enabled.\n");
 		interrupts = true;
 	}
+#endif
 
 	instance->hc_fun = ddf_fun_create(device, fun_exposed, "uhci-hc");
Index: uspace/lib/usb/include/usb/request.h
===================================================================
--- uspace/lib/usb/include/usb/request.h	(revision 1cbfd6b0e80bcc9b36186ad5f99dc9b0f0b68ff7)
+++ uspace/lib/usb/include/usb/request.h	(revision 4acf099b70c331292c191767acea76db03805008)
@@ -41,4 +41,13 @@
 #include <usb/pipes.h>
 #include <usb/descriptor.h>
+
+/** USB device status - device is self powered (opposed to bus powered). */
+#define USB_DEVICE_STATUS_SELF_POWERED ((uint16_t)(1 << 0))
+
+/** USB device status - remote wake-up signaling is enabled. */
+#define USB_DEVICE_STATUS_REMOTE_WAKEUP ((uint16_t)(1 << 1))
+
+/** USB endpoint status - endpoint is halted (stalled). */
+#define USB_ENDPOINT_STATUS_HALTED ((uint16_t)(1 << 0))
 
 /** Standard device request. */
