[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