summaryrefslogtreecommitdiffstats
path: root/src/drivers/usb/xhci.c
diff options
context:
space:
mode:
authorMichael Brown2015-02-10 00:50:35 +0100
committerMichael Brown2015-02-10 02:14:22 +0100
commit17aceb34da3bad166cab8579a3616806fff8e05b (patch)
treeb5a155eb8dcd66bb06955601bd76b86e27730b23 /src/drivers/usb/xhci.c
parent[usb] Handle CDC union functional descriptors (diff)
downloadipxe-17aceb34da3bad166cab8579a3616806fff8e05b.tar.gz
ipxe-17aceb34da3bad166cab8579a3616806fff8e05b.tar.xz
ipxe-17aceb34da3bad166cab8579a3616806fff8e05b.zip
[usb] Parse endpoint descriptor bInterval field
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/drivers/usb/xhci.c')
-rw-r--r--src/drivers/usb/xhci.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/drivers/usb/xhci.c b/src/drivers/usb/xhci.c
index cdebc47d..49901275 100644
--- a/src/drivers/usb/xhci.c
+++ b/src/drivers/usb/xhci.c
@@ -1986,6 +1986,7 @@ static void xhci_configure_endpoint_input ( struct xhci_device *xhci,
/* Populate endpoint context */
ep_ctx = ( input + xhci_input_context_offset ( xhci, endpoint->ctx ) );
+ ep_ctx->interval = endpoint->interval;
ep_ctx->type = endpoint->type;
ep_ctx->burst = endpoint->ep->burst;
ep_ctx->mtu = cpu_to_le16 ( endpoint->ep->mtu );
@@ -2252,6 +2253,7 @@ static int xhci_endpoint_open ( struct usb_endpoint *ep ) {
struct xhci_endpoint *endpoint;
unsigned int ctx;
unsigned int type;
+ unsigned int interval;
int rc;
/* Calculate context index */
@@ -2265,6 +2267,13 @@ static int xhci_endpoint_open ( struct usb_endpoint *ep ) {
if ( ep->address & USB_DIR_IN )
type |= XHCI_EP_TYPE_IN;
+ /* Calculate interval */
+ if ( type & XHCI_EP_TYPE_PERIODIC ) {
+ interval = ( fls ( ep->interval ) - 1 );
+ } else {
+ interval = ep->interval;
+ }
+
/* Allocate and initialise structure */
endpoint = zalloc ( sizeof ( *endpoint ) );
if ( ! endpoint ) {
@@ -2278,6 +2287,7 @@ static int xhci_endpoint_open ( struct usb_endpoint *ep ) {
endpoint->ep = ep;
endpoint->ctx = ctx;
endpoint->type = type;
+ endpoint->interval = interval;
endpoint->context = ( ( ( void * ) slot->context ) +
xhci_device_context_offset ( xhci, ctx ) );