Index: uspace/lib/usb/include/usb/descriptor.h
===================================================================
--- uspace/lib/usb/include/usb/descriptor.h	(revision cecba66ea48d60cfa59865e98aeda663808e42c7)
+++ uspace/lib/usb/include/usb/descriptor.h	(revision cfe485248470eaa3e68e053d375e4c11a7b486e9)
@@ -49,4 +49,10 @@
 	USB_DESCTYPE_OTHER_SPEED_CONFIGURATION = 7,
 	USB_DESCTYPE_INTERFACE_POWER = 8,
+	/* USB 3.0 types */
+	USB_DESCTYPE_OTG = 9,
+	USB_DESCTYPE_DEBUG = 0xa,
+	USB_DESCTYPE_IFACE_ASSOC = 0xb,
+	USB_DESCTYPE_BOS = 0xf,
+	USB_DESCTYPE_DEVICE_CAP = 0x10,
 	/* Class specific */
 	USB_DESCTYPE_HID = 0x21,
@@ -54,4 +60,5 @@
 	USB_DESCTYPE_HID_PHYSICAL = 0x23,
 	USB_DESCTYPE_HUB = 0x29,
+	USB_DESCTYPE_SSPEED_EP_COMPANION = 0x30
 	/* USB_DESCTYPE_ = */
 } usb_descriptor_type_t;
@@ -217,4 +224,34 @@
 } __attribute__ ((packed)) usb_standard_endpoint_descriptor_t;
 
+/** Superspeed USB endpoint companion descriptor.
+ * See USB 3 specification, section 9.6.7.
+ */
+typedef struct {
+	/** Size of this descriptor in bytes */
+	uint8_t length;
+	/** Descriptor type (USB_DESCTYPE_SSPEED_EP_COMPANION). */
+	uint8_t descriptor_type;
+	/** The maximum number of packets the endpoint can send
+	 * or receive as part of a burst. Valid values are from 0 to 15.
+	 * The endpoint can only burst max_burst + 1 packets at a time.
+	 */
+	uint8_t max_burst;
+	/** Valid only for bulk and isochronous endpoints.
+	 * For bulk endpoints, this field contains the amount of streams
+	 * supported by the endpoint.
+	 * For isochronous endpoints, this field contains either maximum
+	 * number of packets supported within a service interval, or
+	 * whether an isochronous endpoint companion descriptor follows.
+	 */
+	uint8_t attributes;
+#define SS_COMPANION_MAX_STREAMS(attributes) \
+	(attributes & 0x1f)
+	/** The total number of bytes this endpoint will transfer
+	 * every service interval (SI).
+	 * This field is only valid for periodic endpoints.
+	 */
+	uint16_t bytes_per_interval;
+} __attribute__ ((packed)) usb_superspeed_endpoint_companion_descriptor_t;
+
 /** Part of standard USB HID descriptor specifying one class descriptor.
  *
Index: uspace/lib/usb/include/usb/request.h
===================================================================
--- uspace/lib/usb/include/usb/request.h	(revision cecba66ea48d60cfa59865e98aeda663808e42c7)
+++ uspace/lib/usb/include/usb/request.h	(revision cfe485248470eaa3e68e053d375e4c11a7b486e9)
@@ -110,6 +110,37 @@
 static_assert(sizeof(usb_device_request_setup_packet_t) == 8);
 
-int usb_request_needs_toggle_reset(
+/** How many toggles need to be reset */
+typedef enum {
+	RESET_NONE,
+	RESET_EP,
+	RESET_ALL
+} toggle_reset_mode_t;
+
+toggle_reset_mode_t usb_request_get_toggle_reset_mode(
     const usb_device_request_setup_packet_t *request);
+
+#define GET_DEVICE_DESC(size) \
+{ \
+	.request_type = SETUP_REQUEST_TYPE_DEVICE_TO_HOST \
+	    | (USB_REQUEST_TYPE_STANDARD << 5) \
+	    | USB_REQUEST_RECIPIENT_DEVICE, \
+	.request = USB_DEVREQ_GET_DESCRIPTOR, \
+	.value = uint16_host2usb(USB_DESCTYPE_DEVICE << 8), \
+	.index = uint16_host2usb(0), \
+	.length = uint16_host2usb(size), \
+};
+
+#define SET_ADDRESS(address) \
+{ \
+	.request_type = SETUP_REQUEST_TYPE_HOST_TO_DEVICE \
+	    | (USB_REQUEST_TYPE_STANDARD << 5) \
+	    | USB_REQUEST_RECIPIENT_DEVICE, \
+	.request = USB_DEVREQ_SET_ADDRESS, \
+	.value = uint16_host2usb(address), \
+	.index = uint16_host2usb(0), \
+	.length = uint16_host2usb(0), \
+};
+
+#define CTRL_PIPE_MIN_PACKET_SIZE 8
 
 #endif
Index: uspace/lib/usb/src/usb.c
===================================================================
--- uspace/lib/usb/src/usb.c	(revision cecba66ea48d60cfa59865e98aeda663808e42c7)
+++ uspace/lib/usb/src/usb.c	(revision cfe485248470eaa3e68e053d375e4c11a7b486e9)
@@ -44,4 +44,5 @@
 	[USB_SPEED_FULL] = "full",
 	[USB_SPEED_HIGH] = "high",
+	[USB_SPEED_SUPER] = "super",
 };
 
@@ -127,5 +128,5 @@
  *
  */
-int usb_request_needs_toggle_reset(
+toggle_reset_mode_t usb_request_get_toggle_reset_mode(
     const usb_device_request_setup_packet_t *request)
 {
@@ -138,5 +139,5 @@
 		if ((request->request_type == 0x2) &&
 		    (request->value == USB_FEATURE_ENDPOINT_HALT))
-			return uint16_usb2host(request->index);
+			return RESET_EP;
 		break;
 	case USB_DEVREQ_SET_CONFIGURATION:
@@ -148,10 +149,11 @@
 		 * interface of an already setup device. */
 		if (!(request->request_type & SETUP_REQUEST_TYPE_DEVICE_TO_HOST))
-			return 0;
+			return RESET_ALL;
 		break;
 	default:
 		break;
 	}
-	return -1;
+
+	return RESET_NONE;
 }
 
