[coreboot-gerrit] Patch set updated for coreboot: a632b92 usbdebug: Reference endpoints by pipes in calls

Kyösti Mälkki (kyosti.malkki@gmail.com) gerrit at coreboot.org
Fri Aug 23 07:12:59 CEST 2013


Kyösti Mälkki (kyosti.malkki at gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/3864

-gerrit

commit a632b92c6022f3a0f0e6b35a80ad996137840f09
Author: Kyösti Mälkki <kyosti.malkki at gmail.com>
Date:   Sat Aug 10 10:34:01 2013 +0300

    usbdebug: Reference endpoints by pipes in calls
    
    Add allocation for endpoint0 as a pipe for control messages.
    
    Endpoint number was already stored in the pipe object, place devnum
    there too, although all pipes will use same devnum==127.
    
    Change-Id: I299d139bdd8083af8b04a694e8e41435ec026a25
    Signed-off-by: Kyösti Mälkki <kyosti.malkki at gmail.com>
---
 src/lib/usbdebug.c | 53 +++++++++++++++++++++++++++++------------------------
 1 file changed, 29 insertions(+), 24 deletions(-)

diff --git a/src/lib/usbdebug.c b/src/lib/usbdebug.c
index 0ef7c4d..9e8f42c 100644
--- a/src/lib/usbdebug.c
+++ b/src/lib/usbdebug.c
@@ -39,6 +39,7 @@
 
 struct dbgp_pipe
 {
+	u8 devnum;
 	u8 endpoint;
 	u8 status;
 	u8 bufidx;
@@ -51,8 +52,6 @@ struct dbgp_pipe
 #define DBGP_CONSOLE_EPIN	2
 
 struct ehci_debug_info {
-	u8 devnum;
-
 	void *ehci_caps;
 	void *ehci_regs;
 	void *ehci_debug;
@@ -152,7 +151,8 @@ static void dbgp_breath(void)
 	/* Sleep to give the debug port a chance to breathe */
 }
 
-static int dbgp_wait_until_done(struct ehci_dbg_port *ehci_debug, unsigned ctrl, int loop)
+static int dbgp_wait_until_done(struct ehci_dbg_port *ehci_debug, struct dbgp_pipe *pipe,
+	unsigned ctrl, int loop)
 {
 	u32 pids, lpid;
 	int ret;
@@ -213,8 +213,8 @@ static void dbgp_get_data(struct ehci_dbg_port *ehci_debug, void *buf, int size)
 		bytes[i] = (hi >> (8*(i - 4))) & 0xff;
 }
 
-static int dbgp_bulk_write(struct ehci_dbg_port *ehci_debug,
-		unsigned devnum, unsigned endpoint, const char *bytes, int size)
+static int dbgp_bulk_write(struct ehci_dbg_port *ehci_debug, struct dbgp_pipe *pipe,
+	const char *bytes, int size)
 {
 	u32 pids, addr, ctrl;
 	int ret;
@@ -222,7 +222,7 @@ static int dbgp_bulk_write(struct ehci_dbg_port *ehci_debug,
 	if (size > DBGP_MAX_PACKET)
 		return -1;
 
-	addr = DBGP_EPADDR(devnum, endpoint);
+	addr = DBGP_EPADDR(pipe->devnum, pipe->endpoint);
 
 	pids = read32((unsigned long)&ehci_debug->pids);
 	pids = DBGP_PID_UPDATE(pids, USB_PID_OUT);
@@ -236,7 +236,7 @@ static int dbgp_bulk_write(struct ehci_dbg_port *ehci_debug,
 	write32((unsigned long)&ehci_debug->address, addr);
 	write32((unsigned long)&ehci_debug->pids, pids);
 
-	ret = dbgp_wait_until_done(ehci_debug, ctrl, DBGP_LOOPS);
+	ret = dbgp_wait_until_done(ehci_debug, pipe, ctrl, DBGP_LOOPS);
 
 	return ret;
 }
@@ -244,12 +244,11 @@ static int dbgp_bulk_write(struct ehci_dbg_port *ehci_debug,
 int dbgp_bulk_write_x(struct dbgp_pipe *pipe, const char *bytes, int size)
 {
 	struct ehci_debug_info *dbg_info = dbgp_ehci_info();
-	return dbgp_bulk_write(dbg_info->ehci_debug, dbg_info->devnum,
-			pipe->endpoint, bytes, size);
+	return dbgp_bulk_write(dbg_info->ehci_debug, pipe, bytes, size);
 }
 
-static int dbgp_bulk_read(struct ehci_dbg_port *ehci_debug, unsigned devnum,
-		unsigned endpoint, void *data, int size, int loops)
+static int dbgp_bulk_read(struct ehci_dbg_port *ehci_debug, struct dbgp_pipe *pipe,
+	void *data, int size, int loops)
 {
 	u32 pids, addr, ctrl;
 	int ret;
@@ -257,7 +256,7 @@ static int dbgp_bulk_read(struct ehci_dbg_port *ehci_debug, unsigned devnum,
 	if (size > DBGP_MAX_PACKET)
 		return -1;
 
-	addr = DBGP_EPADDR(devnum, endpoint);
+	addr = DBGP_EPADDR(pipe->devnum, pipe->endpoint);
 
 	pids = read32((unsigned long)&ehci_debug->pids);
 	pids = DBGP_PID_UPDATE(pids, USB_PID_IN);
@@ -269,7 +268,7 @@ static int dbgp_bulk_read(struct ehci_dbg_port *ehci_debug, unsigned devnum,
 
 	write32((unsigned long)&ehci_debug->address, addr);
 	write32((unsigned long)&ehci_debug->pids, pids);
-	ret = dbgp_wait_until_done(ehci_debug, ctrl, loops);
+	ret = dbgp_wait_until_done(ehci_debug, pipe, ctrl, loops);
 	if (ret < 0)
 		return ret;
 
@@ -282,8 +281,7 @@ static int dbgp_bulk_read(struct ehci_dbg_port *ehci_debug, unsigned devnum,
 int dbgp_bulk_read_x(struct dbgp_pipe *pipe, void *data, int size)
 {
 	struct ehci_debug_info *dbg_info = dbgp_ehci_info();
-	return dbgp_bulk_read(dbg_info->ehci_debug, dbg_info->devnum,
-			pipe->endpoint, data, size, DBGP_LOOPS);
+	return dbgp_bulk_read(dbg_info->ehci_debug, pipe, data, size, DBGP_LOOPS);
 }
 
 static void dbgp_mdelay(int ms)
@@ -299,6 +297,8 @@ static void dbgp_mdelay(int ms)
 static int dbgp_control_msg(struct ehci_dbg_port *ehci_debug, unsigned devnum, int requesttype,
 		int request, int value, int index, void *data, int size)
 {
+	struct ehci_debug_info *info = dbgp_ehci_info();
+	struct dbgp_pipe *pipe = &info->ep_pipe[DBGP_SETUP_EP0];
 	u32 pids, addr, ctrl;
 	struct usb_ctrlrequest req;
 	int read;
@@ -315,8 +315,10 @@ static int dbgp_control_msg(struct ehci_dbg_port *ehci_debug, unsigned devnum, i
 	req.wIndex = cpu_to_le16(index);
 	req.wLength = cpu_to_le16(size);
 
+	pipe->devnum = devnum;
+	pipe->endpoint = 0;
+	addr = DBGP_EPADDR(pipe->devnum, pipe->endpoint);
 	pids = DBGP_PID_SET(USB_PID_DATA0, USB_PID_SETUP);
-	addr = DBGP_EPADDR(devnum, 0);
 
 	ctrl = read32((unsigned long)&ehci_debug->control);
 	ctrl = DBGP_LEN_UPDATE(ctrl, sizeof(req));
@@ -327,13 +329,12 @@ static int dbgp_control_msg(struct ehci_dbg_port *ehci_debug, unsigned devnum, i
 	dbgp_set_data(ehci_debug, &req, sizeof(req));
 	write32((unsigned long)&ehci_debug->address, addr);
 	write32((unsigned long)&ehci_debug->pids, pids);
-	ret = dbgp_wait_until_done(ehci_debug, ctrl, DBGP_LOOPS);
+	ret = dbgp_wait_until_done(ehci_debug, pipe, ctrl, DBGP_LOOPS);
 	if (ret < 0)
 		return ret;
 
-
 	/* Read the result */
-	ret = dbgp_bulk_read(ehci_debug, devnum, 0, data, size, DBGP_LOOPS);
+	ret = dbgp_bulk_read(ehci_debug, pipe, data, size, DBGP_LOOPS);
 	return ret;
 }
 
@@ -590,10 +591,17 @@ debug_dev_found:
 	}
 	dprintk(BIOS_INFO, "EHCI debug interface enabled.\n");
 
-	/* Perform a small write to get the even/odd data state in sync */
+	/* Prepare endpoint pipes. */
+	for (i=1; i<DBGP_MAX_ENDPOINTS; i++) {
+		info->ep_pipe[i].devnum = USB_DEBUG_DEVNUM;
+	}
+	info->ep_pipe[DBGP_CONSOLE_EPOUT].endpoint = dbgp_desc.bDebugOutEndpoint;
+	info->ep_pipe[DBGP_CONSOLE_EPIN].endpoint = dbgp_desc.bDebugInEndpoint;
+
+	/* Perform a small write. */
 	configured = 0;
 small_write:
-	ret = dbgp_bulk_write(ehci_debug, USB_DEBUG_DEVNUM, dbgp_desc.bDebugOutEndpoint, "USB\r\n",5);
+	ret = dbgp_bulk_write(ehci_debug, &info->ep_pipe[DBGP_CONSOLE_EPOUT], "USB\r\n",5);
 	if (ret < 0) {
 		dprintk(BIOS_INFO, "dbgp_bulk_write failed: %d\n", ret);
 		if (!configured) {
@@ -615,10 +623,7 @@ small_write:
 	info->ehci_caps = ehci_caps;
 	info->ehci_regs = ehci_regs;
 	info->ehci_debug = ehci_debug;
-	info->devnum = devnum;
 
-	info->ep_pipe[DBGP_CONSOLE_EPOUT].endpoint = dbgp_desc.bDebugOutEndpoint;
-	info->ep_pipe[DBGP_CONSOLE_EPIN].endpoint = dbgp_desc.bDebugInEndpoint;
 	info->ep_pipe[DBGP_SETUP_EP0].status |= DBGP_EP_ENABLED | DBGP_EP_VALID;
 	info->ep_pipe[DBGP_CONSOLE_EPOUT].status |= DBGP_EP_ENABLED | DBGP_EP_VALID;
 	info->ep_pipe[DBGP_CONSOLE_EPIN].status |= DBGP_EP_ENABLED | DBGP_EP_VALID;



More information about the coreboot-gerrit mailing list