[coreboot] [PATCH] usb_stack: some api adaptations

Daniel Mack daniel at caiaq.de
Mon Oct 5 04:44:43 CEST 2009


From: Leandro Dorilex <ldorileo at gmail.com>

To fit our current ohci implementation we have to make some hc functions to return
int instead of void returning we currenctly verify handle errors using those returns.
---
 drivers/usb/uhci.c   |   32 +++++++++++++++++---------------
 drivers/usb/usb.c    |   14 +++++++-------
 drivers/usb/usbmsc.c |    4 ++--
 include/usb/usb.h    |    9 ++++++---
 4 files changed, 32 insertions(+), 27 deletions(-)

diff --git a/drivers/usb/uhci.c b/drivers/usb/uhci.c
index def6b45..7eb947b 100644
--- a/drivers/usb/uhci.c
+++ b/drivers/usb/uhci.c
@@ -31,19 +31,27 @@
 #include "uhci.h"
 #include <arch/virtual.h>
 
-static void uhci_start (hci_t *controller);
+static int uhci_start (hci_t *controller);
 static void uhci_stop (hci_t *controller);
-static void uhci_reset (hci_t *controller);
+static int uhci_reset (hci_t *controller);
 static void uhci_shutdown (hci_t *controller);
 static int uhci_packet (usbdev_t *dev, int endp, int pid, int toggle,
 			int length, u8 *data);
 static int uhci_bulk (endpoint_t *ep, int size, u8 *data, int finalize);
-static int uhci_control (usbdev_t *dev, pid_t dir, int drlen, void *devreq,
+static int uhci_control (endpoint_t *ep, pid_t dir, int drlen, void *devreq,
 			 int dalen, u8 *data);
 static void* uhci_create_intr_queue (endpoint_t *ep, int reqsize, int reqcount, int reqtiming);
 static void uhci_destroy_intr_queue (endpoint_t *ep, void *queue);
 static u8* uhci_poll_intr_queue (void *queue);
 
+int min (int a, int b)
+{
+   if (a < b)
+       return a;
+   else
+       return b;
+}
+
 #if 0
 /* dump uhci */
 static void
@@ -96,7 +104,7 @@ td_dump (td_t *td)
 		printf (" still active - timeout?\n");
 }
 
-static void
+static int
 uhci_reset (hci_t *controller)
 {
 	/* reset */
@@ -122,6 +130,7 @@ uhci_reset (hci_t *controller)
 	uhci_reg_mask16 (controller, USBCMD, ~0, 0xc0);	// max packets, configure flag
 
 	uhci_start (controller);
+    return 1;
 }
 
 hci_t *
@@ -246,10 +255,11 @@ uhci_shutdown (hci_t *controller)
 	free (controller);
 }
 
-static void
+static int
 uhci_start (hci_t *controller)
 {
 	uhci_reg_mask16 (controller, USBCMD, ~0, 1);	// start work on schedule
+    return 1;
 }
 
 static void
@@ -296,18 +306,10 @@ maxlen (int size)
 }
 
 static int
-min (int a, int b)
-{
-	if (a < b)
-		return a;
-	else
-		return b;
-}
-
-static int
-uhci_control (usbdev_t *dev, pid_t dir, int drlen, void *devreq, int dalen,
+uhci_control (endpoint_t *ep, pid_t dir, int drlen, void *devreq, int dalen,
 	      unsigned char *data)
 {
+    usbdev_t *dev = ep->dev;
 	int endp = 0;		/* this is control: always 0 */
 	int mlen = dev->endpoints[0].maxpacketsize;
 	int count = (2 + (dalen + mlen - 1) / mlen);
diff --git a/drivers/usb/usb.c b/drivers/usb/usb.c
index 25e8006..4a0dbad 100644
--- a/drivers/usb/usb.c
+++ b/drivers/usb/usb.c
@@ -111,7 +111,7 @@ set_feature (usbdev_t *dev, int endp, int feature, int rtype)
 	dr.wValue = feature;
 	dr.wIndex = endp;
 	dr.wLength = 0;
-	dev->controller->control (dev, OUT, sizeof (dr), &dr, 0, 0);
+	dev->controller->control (&dev->endpoints[0], OUT, sizeof (dr), &dr, 0, 0);
 }
 
 void
@@ -125,7 +125,7 @@ get_status (usbdev_t *dev, int intf, int rtype, int len, void *data)
 	dr.wValue = 0;
 	dr.wIndex = intf;
 	dr.wLength = len;
-	dev->controller->control (dev, IN, sizeof (dr), &dr, len, data);
+	dev->controller->control (&dev->endpoints[0], IN, sizeof (dr), &dr, len, data);
 }
 
 u8 *
@@ -143,7 +143,7 @@ get_descriptor (usbdev_t *dev, unsigned char bmRequestType, int descType,
 	dr.wValue = (descType << 8) | descIdx;
 	dr.wIndex = langID;
 	dr.wLength = 8;
-	if (dev->controller->control (dev, IN, sizeof (dr), &dr, 8, buf)) {
+	if (dev->controller->control (&dev->endpoints[0], IN, sizeof (dr), &dr, 8, buf)) {
 		printf ("getting descriptor size (type %x) failed\n",
 			descType);
 	}
@@ -167,7 +167,7 @@ get_descriptor (usbdev_t *dev, unsigned char bmRequestType, int descType,
 	memset (result, 0, size);
 	dr.wLength = size;
 	if (dev->controller->
-	    control (dev, IN, sizeof (dr), &dr, size, result)) {
+	    control (&dev->endpoints[0], IN, sizeof (dr), &dr, size, result)) {
 		printf ("getting descriptor (type %x, size %x) failed\n",
 			descType, size);
 	}
@@ -185,7 +185,7 @@ set_configuration (usbdev_t *dev)
 	dr.wValue = dev->configuration[5];
 	dr.wIndex = 0;
 	dr.wLength = 0;
-	dev->controller->control (dev, OUT, sizeof (dr), &dr, 0, 0);
+	dev->controller->control (&dev->endpoints[0], OUT, sizeof (dr), &dr, 0, 0);
 }
 
 int
@@ -203,7 +203,7 @@ clear_stall (endpoint_t *ep)
 	dr.wValue = ENDPOINT_HALT;
 	dr.wIndex = endp;
 	dr.wLength = 0;
-	dev->controller->control (dev, OUT, sizeof (dr), &dr, 0, 0);
+	dev->controller->control (&dev->endpoints[0], OUT, sizeof (dr), &dr, 0, 0);
 	return 0;
 }
 
@@ -248,7 +248,7 @@ set_address (hci_t *controller, int lowspeed)
 	dev->endpoints[0].toggle = 0;
 	dev->endpoints[0].direction = SETUP;
 	mdelay (50);
-	if (dev->controller->control (dev, OUT, sizeof (dr), &dr, 0, 0)) {
+	if (dev->controller->control (&dev->endpoints[0], OUT, sizeof (dr), &dr, 0, 0)) {
 		printf ("set_address failed\n");
 		return -1;
 	}
diff --git a/drivers/usb/usbmsc.c b/drivers/usb/usbmsc.c
index f24bd6d..fb5d9b6 100644
--- a/drivers/usb/usbmsc.c
+++ b/drivers/usb/usbmsc.c
@@ -122,7 +122,7 @@ typedef struct {
 	dr.wValue = 0;
 	dr.wIndex = 0;
 	dr.wLength = 0;
-	dev->controller->control (dev, OUT, sizeof (dr), &dr, 0, 0);
+	dev->controller->control (&dev->endpoints[0], OUT, sizeof (dr), &dr, 0, 0);
 	clear_stall (MSC_INST (dev)->bulk_in);
 	clear_stall (MSC_INST (dev)->bulk_out);
 }
@@ -143,7 +143,7 @@ get_max_luns (usbdev_t *dev)
 	dr.wValue = 0;
 	dr.wIndex = 0;
 	dr.wLength = 1;
-	if (dev->controller->control (dev, IN, sizeof (dr), &dr, 1, &luns)) {
+	if (dev->controller->control (&dev->endpoints[0], IN, sizeof (dr), &dr, 1, &luns)) {
 		luns = 0;	// assume only 1 lun if req fails
 	}
 	return luns;
diff --git a/include/usb/usb.h b/include/usb/usb.h
index 9f38b84..c3c5f19 100644
--- a/include/usb/usb.h
+++ b/include/usb/usb.h
@@ -115,14 +115,14 @@ struct usbdev_hc {
 	pcidev_t bus_address;
 	u32 reg_base;
 	usbdev_t *devices[128];	// dev 0 is root hub, 127 is last addressable
-	void (*start) (hci_t *controller);
+	int (*start) (hci_t *controller);
 	void (*stop) (hci_t *controller);
-	void (*reset) (hci_t *controller);
+	int (*reset) (hci_t *controller);
 	void (*shutdown) (hci_t *controller);
 	int (*packet) (usbdev_t *dev, int endp, int pid, int toggle,
 		       int length, u8 *data);
 	int (*bulk) (endpoint_t *ep, int size, u8 *data, int finalize);
-	int (*control) (usbdev_t *dev, pid_t pid, int dr_length,
+	int (*control) (endpoint_t *ep, pid_t pid, int dr_length,
 			void *devreq, int data_length, u8 *data);
 	void* (*create_intr_queue) (endpoint_t *ep, int reqsize, int reqcount, int reqtiming);
 	void (*destroy_intr_queue) (endpoint_t *ep, void *queue);
@@ -228,4 +228,7 @@ void usb_detach_device(hci_t *controller, int devno);
 int usb_attach_device(hci_t *controller, int hubaddress, int port, int lowspeed);
 
 void usb_fatal(const char *message) __attribute__ ((noreturn));
+
+#define ED_TO_HCI_T(endpoint)((hci_t *) endpoint->dev->controller)
+
 #endif
-- 
1.6.0.4





More information about the coreboot mailing list