Index: uspace/drv/bus/usb/ehci/ehci_endpoint.c
===================================================================
--- uspace/drv/bus/usb/ehci/ehci_endpoint.c	(revision 4e732f1aa54271f1ae2860aba3864e766f33cddc)
+++ uspace/drv/bus/usb/ehci/ehci_endpoint.c	(revision 42de21a323468c0a530c33fc166fdb97c153e1ec)
@@ -35,4 +35,5 @@
 #include <assert.h>
 #include <stdlib.h>
+#include <usb/debug.h>
 
 #include "utils/malloc32.h"
@@ -50,5 +51,7 @@
 	assert(instance);
 	assert(instance->qh);
-//	qh_toggle_set(instance->qh, toggle);
+	if (qh_toggle_from_td(instance->qh))
+		usb_log_warning("Setting toggle bit for transfer directed EP\n");
+	qh_toggle_set(instance->qh, toggle);
 }
 
@@ -63,6 +66,7 @@
 	assert(instance);
 	assert(instance->qh);
-	return 0;
-//	return qh_toggle_get(instance->qh);
+	if (qh_toggle_from_td(instance->qh))
+		usb_log_warning("Reading useless toggle bit\n");
+	return qh_toggle_get(instance->qh);
 }
 
Index: uspace/drv/bus/usb/ehci/hw_struct/queue_head.h
===================================================================
--- uspace/drv/bus/usb/ehci/hw_struct/queue_head.h	(revision 4e732f1aa54271f1ae2860aba3864e766f33cddc)
+++ uspace/drv/bus/usb/ehci/hw_struct/queue_head.h	(revision 42de21a323468c0a530c33fc166fdb97c153e1ec)
@@ -154,6 +154,28 @@
 {
 	assert(qh);
-	return (qh->horizontal & LINK_POINTER_ADDRESS_MASK);
+	return (EHCI_MEM32_RD(qh->horizontal) & LINK_POINTER_ADDRESS_MASK);
 }
+
+static inline bool qh_toggle_from_td(const qh_t *qh)
+{
+	assert(qh);
+	return (EHCI_MEM32_RD(qh->ep_cap) & QH_EP_CHAR_DTC_FLAG);
+}
+
+static inline void qh_toggle_set(qh_t *qh, int toggle)
+{
+	assert(qh);
+	if (toggle)
+		EHCI_MEM32_SET(qh->status, QH_STATUS_TOGGLE_FLAG);
+	else
+		EHCI_MEM32_CLR(qh->status, QH_STATUS_TOGGLE_FLAG);
+}
+
+static inline int qh_toggle_get(const qh_t *qh)
+{
+	assert(qh);
+	return (EHCI_MEM32_RD(qh->status) & QH_STATUS_TOGGLE_FLAG) ? 1 : 0;
+}
+
 
 void qh_init(qh_t *instance, const endpoint_t *ep);
