Index: uspace/drv/bus/usb/ehci/ehci_bus.c
===================================================================
--- uspace/drv/bus/usb/ehci/ehci_bus.c	(revision 35c37fc2ef57407c4bf38bf0ac3d777777e3ccd1)
+++ uspace/drv/bus/usb/ehci/ehci_bus.c	(revision 9efad54470c08d7d51f40a9febdaa103916aec6f)
@@ -78,5 +78,5 @@
 /** Creates new hcd endpoint representation.
  */
-static endpoint_t *ehci_endpoint_create(device_t *dev, const usb_endpoint_desc_t *desc)
+static endpoint_t *ehci_endpoint_create(device_t *dev, const usb_endpoint_descriptors_t *desc)
 {
 	assert(dev);
Index: uspace/drv/bus/usb/ehci/hw_struct/queue_head.c
===================================================================
--- uspace/drv/bus/usb/ehci/hw_struct/queue_head.c	(revision 35c37fc2ef57407c4bf38bf0ac3d777777e3ccd1)
+++ uspace/drv/bus/usb/ehci/hw_struct/queue_head.c	(revision 9efad54470c08d7d51f40a9febdaa103916aec6f)
@@ -82,5 +82,5 @@
 	}
 	uint32_t ep_cap = QH_EP_CAP_C_MASK_SET(3 << 2) |
-		    QH_EP_CAP_MULTI_SET(ep->packets);
+		    QH_EP_CAP_MULTI_SET(ep->packets_per_uframe);
 	if (ep->device->speed != USB_SPEED_HIGH) {
 		ep_cap |=
Index: uspace/drv/bus/usb/ohci/ohci_bus.c
===================================================================
--- uspace/drv/bus/usb/ohci/ohci_bus.c	(revision 35c37fc2ef57407c4bf38bf0ac3d777777e3ccd1)
+++ uspace/drv/bus/usb/ohci/ohci_bus.c	(revision 9efad54470c08d7d51f40a9febdaa103916aec6f)
@@ -72,5 +72,5 @@
 /** Creates new hcd endpoint representation.
  */
-static endpoint_t *ohci_endpoint_create(device_t *dev, const usb_endpoint_desc_t *desc)
+static endpoint_t *ohci_endpoint_create(device_t *dev, const usb_endpoint_descriptors_t *desc)
 {
 	assert(dev);
Index: uspace/drv/bus/usb/xhci/bus.c
===================================================================
--- uspace/drv/bus/usb/xhci/bus.c	(revision 35c37fc2ef57407c4bf38bf0ac3d777777e3ccd1)
+++ uspace/drv/bus/usb/xhci/bus.c	(revision 9efad54470c08d7d51f40a9febdaa103916aec6f)
@@ -51,13 +51,9 @@
 
 /** Initial descriptor used for control endpoint 0 before more configuration is retrieved. */
-static const usb_endpoint_desc_t ep0_initial_desc = {
-	.endpoint_no = 0,
-	.direction = USB_DIRECTION_BOTH,
-	.transfer_type = USB_TRANSFER_CONTROL,
-	.max_packet_size = CTRL_PIPE_MIN_PACKET_SIZE,
-	.packets = 1,
+static const usb_endpoint_descriptors_t ep0_initial_desc = {
+	.endpoint.max_packet_size = CTRL_PIPE_MIN_PACKET_SIZE,
 };
 
-static endpoint_t *endpoint_create(device_t *, const usb_endpoint_desc_t *);
+static endpoint_t *endpoint_create(device_t *, const usb_endpoint_descriptors_t *);
 
 /** Assign address and control endpoint to a new XHCI device.
@@ -368,5 +364,5 @@
 }
 
-static endpoint_t *endpoint_create(device_t *dev, const usb_endpoint_desc_t *desc)
+static endpoint_t *endpoint_create(device_t *dev, const usb_endpoint_descriptors_t *desc)
 {
 	xhci_endpoint_t *ep = calloc(1, sizeof(xhci_endpoint_t));
Index: uspace/drv/bus/usb/xhci/endpoint.c
===================================================================
--- uspace/drv/bus/usb/xhci/endpoint.c	(revision 35c37fc2ef57407c4bf38bf0ac3d777777e3ccd1)
+++ uspace/drv/bus/usb/xhci/endpoint.c	(revision 9efad54470c08d7d51f40a9febdaa103916aec6f)
@@ -52,5 +52,5 @@
  * @return Error code.
  */
-int xhci_endpoint_init(xhci_endpoint_t *xhci_ep, device_t *dev, const usb_endpoint_desc_t *desc)
+int xhci_endpoint_init(xhci_endpoint_t *xhci_ep, device_t *dev, const usb_endpoint_descriptors_t *desc)
 {
 	assert(xhci_ep);
@@ -60,15 +60,28 @@
 	endpoint_init(ep, dev, desc);
 
-	xhci_ep->max_streams = desc->usb3.max_streams;
-	xhci_ep->max_burst = desc->usb3.max_burst;
-	xhci_ep->mult = desc->usb3.mult;
-
-	// TODO: process according to 6.2.3.6 of XHCI specification; hardcoded for HS/SS EPs
-	xhci_ep->interval = desc->interval - 1;
+	xhci_ep->max_streams = USB_SSC_MAX_STREAMS(desc->companion);
+	xhci_ep->max_burst = desc->companion.max_burst + 1;
+	xhci_ep->mult = USB_SSC_MULT(desc->companion) + 1;
+
+	/* In USB 3, the semantics of wMaxPacketSize changed. Now the number of
+	 * packets per service interval is determined from max_burst and mult.
+	 */
+	if (dev->speed >= USB_SPEED_SUPER) {
+		ep->packets_per_uframe = xhci_ep->max_burst * xhci_ep->mult;
+		ep->max_transfer_size = ep->max_packet_size * ep->packets_per_uframe;
+	}
+
+	xhci_ep->interval = desc->endpoint.poll_interval;
+	/* Only Low/Full speed interrupt endpoints have interval set directly,
+	 * others have 2-based log of it.
+	 */
+	if (dev->speed >= USB_SPEED_HIGH || ep->transfer_type != USB_TRANSFER_INTERRUPT) {
+		xhci_ep->interval = 1 << (xhci_ep->interval - 1);
+	}
 
 	if (xhci_ep->base.transfer_type == USB_TRANSFER_ISOCHRONOUS) {
-		xhci_ep->isoch_max_size = desc->usb3.bytes_per_interval
-			? desc->usb3.bytes_per_interval
-			: desc->max_packet_size * (desc->packets + 1);
+		xhci_ep->isoch_max_size = desc->companion.bytes_per_interval
+			? desc->companion.bytes_per_interval
+			: ep->max_transfer_size;
 		/* Technically there could be superspeed plus too. */
 
@@ -497,6 +510,4 @@
 	dev->endpoints[ep->base.endpoint] = NULL;
 	ep->base.device = NULL;
-
-	endpoint_del_ref(&ep->base);
 }
 
Index: uspace/drv/bus/usb/xhci/endpoint.h
===================================================================
--- uspace/drv/bus/usb/xhci/endpoint.h	(revision 35c37fc2ef57407c4bf38bf0ac3d777777e3ccd1)
+++ uspace/drv/bus/usb/xhci/endpoint.h	(revision 9efad54470c08d7d51f40a9febdaa103916aec6f)
@@ -149,5 +149,5 @@
 #define XHCI_DEV_ARGS(dev)		 ddf_fun_get_name((dev).base.fun), (dev).slot_id
 
-int xhci_endpoint_init(xhci_endpoint_t *, device_t *, const usb_endpoint_desc_t *);
+int xhci_endpoint_init(xhci_endpoint_t *, device_t *, const usb_endpoint_descriptors_t *);
 void xhci_endpoint_fini(xhci_endpoint_t *);
 int xhci_endpoint_alloc_transfer_ds(xhci_endpoint_t *);
