[coreboot-gerrit] Patch set updated for coreboot: 65e361f libpayload: usb: Deep search for endpoints descriptors

Anton Kochkov (anton.kochkov@gmail.com) gerrit at coreboot.org
Fri Jun 14 18:31:44 CEST 2013


Anton Kochkov (anton.kochkov at gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/3467

-gerrit

commit 65e361f9c3247e119f8a2169d25ab29b79558234
Author: Anton Kochkov <anton.kochkov at gmail.com>
Date:   Fri Jun 14 19:41:48 2013 +0400

    libpayload: usb: Deep search for endpoints descriptors
    
    This improving searching for endpoint descriptors
    and skipping non-endpoint interface descriptors.
    
    Change-Id: I063c096ab886f9753a9ee59f570fd81ce6f618cb
    Signed-off-by: Anton Kochkov <anton.kochkov at gmail.com>
---
 payloads/libpayload/drivers/usb/usb.c | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/payloads/libpayload/drivers/usb/usb.c b/payloads/libpayload/drivers/usb/usb.c
index 47f8eb6..b3ce54b 100644
--- a/payloads/libpayload/drivers/usb/usb.c
+++ b/payloads/libpayload/drivers/usb/usb.c
@@ -389,9 +389,21 @@ set_address (hci_t *controller, int speed, int hubport, int hubaddr)
 			endpoint_descriptor_t *endp =
 				(endpoint_descriptor_t *) (((char *) current)
 							   + current->bLength);
-			/* Skip any non-endpoint descriptor */
-			if (endp->bDescriptorType != 0x05)
-				endp = (endpoint_descriptor_t *)(((char *)endp) + ((char *)endp)[0]);
+			/* Search only if endpoints exist */
+			if (current->bNumEndPoints != 0) {
+				/* Skip any non-endpoint descriptor */
+				while ((endp->bDescriptorType != 0x05) &&
+					(endp->bDescriptorType != 0x04) && (endp->bLength != 0)) {
+					endp = (endpoint_descriptor_t *)((char *)endp + endp->bLength);
+				}
+				if (endp->bDescriptorType != 0x05) {
+					controller->devices[adr]->destroy(controller->devices[adr]);
+					free(controller->devices[adr]);
+					controller->devices[adr] = NULL;
+					return -1;
+				}
+
+			}
 
 			memset (dev->endpoints, 0, sizeof (dev->endpoints));
 			dev->num_endp = 1;	// 0 always exists



More information about the coreboot-gerrit mailing list