]> xenbits.xensource.com Git - seabios.git/commitdiff
usb: add usb_update_pipe()
authorGerd Hoffmann <kraxel@redhat.com>
Wed, 21 Aug 2013 11:59:21 +0000 (13:59 +0200)
committerGerd Hoffmann <kraxel@redhat.com>
Thu, 19 Sep 2013 11:04:53 +0000 (13:04 +0200)
Preparation for better xhci support: allows to notify host controllers
instead of going through a free+alloc cycle.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
src/hw/usb.c

index 59d2a93a53910f03f7b85d1cf73c1948f0d08419..b4d0ab8125dc33eb24d5138e92efeeb32749b09d 100644 (file)
@@ -44,6 +44,18 @@ usb_alloc_pipe(struct usbdevice_s *usbdev
     }
 }
 
+// Update an pipe (used for control only)
+struct usb_pipe *
+usb_update_pipe(struct usbdevice_s *usbdev, struct usb_pipe *pipe
+                , struct usb_endpoint_descriptor *epdesc)
+{
+    switch (usbdev->hub->cntl->type) {
+    default:
+        free_pipe(pipe);
+        return usb_alloc_pipe(usbdev, epdesc);
+    }
+}
+
 // Send a message on a control pipe using the default control descriptor.
 static int
 send_control(struct usb_pipe *pipe, int dir, const void *cmd, int cmdsize
@@ -262,15 +274,16 @@ usb_set_address(struct usbdevice_s *usbdev)
     req.wIndex = 0;
     req.wLength = 0;
     int ret = send_default_control(usbdev->defpipe, &req, NULL);
-    free_pipe(usbdev->defpipe);
-    if (ret)
+    if (ret) {
+        free_pipe(usbdev->defpipe);
         return -1;
+    }
 
     msleep(USB_TIME_SETADDR_RECOVERY);
 
     cntl->maxaddr++;
     usbdev->devaddr = cntl->maxaddr;
-    usbdev->defpipe = usb_alloc_pipe(usbdev, &epdesc);
+    usbdev->defpipe = usb_update_pipe(usbdev, usbdev->defpipe, &epdesc);
     if (!usbdev->defpipe)
         return -1;
     return 0;
@@ -294,12 +307,11 @@ configure_usb_device(struct usbdevice_s *usbdev)
             , dinfo.bDeviceProtocol, dinfo.bMaxPacketSize0);
     if (dinfo.bMaxPacketSize0 < 8 || dinfo.bMaxPacketSize0 > 64)
         return 0;
-    free_pipe(usbdev->defpipe);
     struct usb_endpoint_descriptor epdesc = {
         .wMaxPacketSize = dinfo.bMaxPacketSize0,
         .bmAttributes = USB_ENDPOINT_XFER_CONTROL,
     };
-    usbdev->defpipe = usb_alloc_pipe(usbdev, &epdesc);
+    usbdev->defpipe = usb_update_pipe(usbdev, usbdev->defpipe, &epdesc);
     if (!usbdev->defpipe)
         return -1;