Index: uspace/drv/usbkbd/main.c
===================================================================
--- uspace/drv/usbkbd/main.c	(revision 70c852118889bcf58e9f4542b5879ca3051632d5)
+++ uspace/drv/usbkbd/main.c	(revision 101ef25c4b30388a9bb0c6cbf006cdbac2e5b1c1)
@@ -50,12 +50,17 @@
 	kbd_dev->device = dev;
 
+	// get phone to my HC and save it as my parent's phone
+	// TODO: maybe not a good idea if DDF will use parent_phone
+	kbd_dev->device->parent_phone = usb_drv_hc_connect(dev, 0);
+
 	kbd_dev->address = usb_drv_get_my_address(dev->parent_phone,
 	    dev);
 
-	if (kbd_dev->address < 0) {
-		fprintf(stderr, NAME ": No device address!\n");
-		free(kbd_dev);
-		return NULL;
-	}
+	// doesn't matter now that we have no address
+//	if (kbd_dev->address < 0) {
+//		fprintf(stderr, NAME ": No device address!\n");
+//		free(kbd_dev);
+//		return NULL;
+//	}
 
 	// default endpoint
@@ -69,5 +74,13 @@
 }
 
-/* Call this periodically to check keyboard status changes. */
+static void usbkbd_process_interrupt_in(usb_hid_dev_kbd_t *kbd_dev,
+					char *buffer, size_t actual_size)
+{
+	/*
+	 * here, the parser will be called, probably with some callbacks
+	 * now only take last 6 bytes and process, i.e. send to kbd
+	 */
+}
+
 static void usbkbd_poll_keyboard(usb_hid_dev_kbd_t *kbd_dev)
 {
@@ -89,27 +102,33 @@
 	};
 
-	rc = usb_drv_async_interrupt_in(kbd_dev->device->parent_phone,
-	    poll_target, buffer, BUFFER_SIZE, &actual_size, &handle);
-
-	if (rc != EOK) {
-		return;
-	}
-
-	rc = usb_drv_async_wait_for(handle);
-	if (rc != EOK) {
-		return;
-	}
-
-	/*
-	 * If the keyboard answered with NAK, it returned no data.
-	 * This implies that no change happened since last query.
-	 */
-	if (actual_size == 0) {
-		return;
-	}
-
-	/*
-	 * TODO: Process pressed keys.
-	 */
+	while (true) {
+		rc = usb_drv_async_interrupt_in(kbd_dev->device->parent_phone,
+		    poll_target, buffer, BUFFER_SIZE, &actual_size, &handle);
+
+		if (rc != EOK) {
+			continue;
+		}
+
+		rc = usb_drv_async_wait_for(handle);
+		if (rc != EOK) {
+			continue;
+		}
+
+		/*
+		 * If the keyboard answered with NAK, it returned no data.
+		 * This implies that no change happened since last query.
+		 */
+		if (actual_size == 0) {
+			continue;
+		}
+
+		/*
+		 * TODO: Process pressed keys.
+		 */
+		usbkbd_process_interrupt_in(kbd_dev, buffer, actual_size);
+	}
+
+	// not reached
+	assert(0);
 }
 
@@ -136,5 +155,5 @@
 {
 	/* For now, fail immediately. */
-	return ENOTSUP;
+	//return ENOTSUP;
 
 	/*
