libpayload: Add clear_feature() function to USB framework
This function will be used by the USB hub driver.
Change-Id: I4d1d2e94f4442cbb636ae989e8ffd543181c4357
Signed-off-by: Nico Huber <nico.huber@secunet.com>
Reviewed-on: http://review.coreboot.org/1079
Tested-by: build bot (Jenkins)
Reviewed-by: Patrick Georgi <patrick@georgi-clan.de>
diff --git a/payloads/libpayload/drivers/usb/usb.c b/payloads/libpayload/drivers/usb/usb.c
index 1f21e6a..1e8f248 100644
--- a/payloads/libpayload/drivers/usb/usb.c
+++ b/payloads/libpayload/drivers/usb/usb.c
@@ -205,22 +205,29 @@
dev->controller->control (dev, OUT, sizeof (dr), &dr, 0, 0);
}
+void
+clear_feature (usbdev_t *dev, int endp, int feature, int rtype)
+{
+ dev_req_t dr;
+
+ dr.bmRequestType = rtype;
+ dr.data_dir = host_to_device;
+ dr.bRequest = CLEAR_FEATURE;
+ dr.wValue = feature;
+ dr.wIndex = endp;
+ dr.wLength = 0;
+ dev->controller->control (dev, OUT, sizeof (dr), &dr, 0, 0);
+}
+
int
clear_stall (endpoint_t *ep)
{
usbdev_t *dev = ep->dev;
int endp = ep->endpoint;
- dev_req_t dr;
+ int rtype = gen_bmRequestType (host_to_device, standard_type,
+ endp ? endp_recp : dev_recp);
- dr.bmRequestType = 0;
- if (endp != 0) {
- dr.req_recp = endp_recp;
- }
- dr.bRequest = CLEAR_FEATURE;
- dr.wValue = ENDPOINT_HALT;
- dr.wIndex = endp;
- dr.wLength = 0;
- dev->controller->control (dev, OUT, sizeof (dr), &dr, 0, 0);
+ clear_feature (dev, endp, ENDPOINT_HALT, rtype);
ep->toggle = 0;
return 0;
}