Index: uspace/drv/usbhid/usbhid.c
===================================================================
--- uspace/drv/usbhid/usbhid.c	(revision caed78437b6b0f28267288bb60dc9410e856aaf5)
+++ uspace/drv/usbhid/usbhid.c	(revision 4bb9fd2b77aefd296503e9aee65477cab87ea122)
@@ -238,4 +238,7 @@
 	int i = 0, count = 0;
 	const usb_hid_subdriver_mapping_t *mapping = &usb_hid_subdrivers[i];
+
+	bool ids_matched;
+	bool matched;
 	
 	while (count < USB_HID_MAX_SUBDRIVERS &&
@@ -254,4 +257,7 @@
 		}
 		
+		ids_matched = false;
+		matched = false;
+		
 		if (mapping->vendor_id != 0) {
 			assert(mapping->product_id != 0);
@@ -260,8 +266,6 @@
 			    mapping->product_id);
 			if (usb_hid_ids_match(hid_dev, mapping)) {
-				usb_log_debug("Matched.\n");
-				subdrivers[count++] = &mapping->subdriver;
-				// skip the checking of usage path
-				goto next;
+				usb_log_debug("IDs matched.\n");
+				ids_matched = true;
 			}
 		}
@@ -271,10 +275,16 @@
 			if (usb_hid_path_matches(hid_dev, 
 			    mapping->usage_path, mapping->compare)) {
-				subdrivers[count++] = &mapping->subdriver;
-			} else {
-				usb_log_debug("Not matched.\n");
+				// does not matter if IDs were matched
+				matched = true;
 			}
-		}
-	next:
+		} else {
+			// matched only if IDs were matched and there is no path
+			matched = ids_matched;
+		}
+		
+		if (matched) {
+			subdrivers[count++] = &mapping->subdriver;
+		}
+		
 		mapping = &usb_hid_subdrivers[++i];
 	}
