[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1446538452-23099-11-git-send-email-baolu.lu@linux.intel.com>
Date: Tue, 3 Nov 2015 16:14:10 +0800
From: Lu Baolu <baolu.lu@...ux.intel.com>
To: Mathias Nyman <mathias.nyman@...el.com>,
Greg Kroah-Hartman <gregkh@...uxfoundation.org>,
Alan Stern <stern@...land.harvard.edu>
Cc: linux-usb@...r.kernel.org, linux-kernel@...r.kernel.org,
Lu Baolu <baolu.lu@...ux.intel.com>
Subject: [PATCH v2 10/12] usb: xhci: dbc: add handshake between debug target and host
After DbC setup, debug target needs to wait until tty driver and
application (e.g. mincom) on debug taget start. Otherwise, out
messages might be ignored.
This patch adds a ping/pong mechanism between debug target and
host. Debug target will be waiting there until user presses 'Y'
or 'y' in the tty application.
Signed-off-by: Lu Baolu <baolu.lu@...ux.intel.com>
---
drivers/usb/early/xhci-dbc.c | 27 +++++++++++++++++++++++++++
1 file changed, 27 insertions(+)
diff --git a/drivers/usb/early/xhci-dbc.c b/drivers/usb/early/xhci-dbc.c
index 68a7139..b75c523 100644
--- a/drivers/usb/early/xhci-dbc.c
+++ b/drivers/usb/early/xhci-dbc.c
@@ -32,6 +32,9 @@
static struct xdbc_state xdbc_stat;
static struct xdbc_state *xdbcp = &xdbc_stat;
+static int early_xdbc_read(struct console *con, char *str, unsigned n);
+static void early_xdbc_write(struct console *con, const char *str, u32 n);
+
#ifdef DBC_DEBUG
#define XDBC_DEBUG_BUF_SIZE (PAGE_SIZE * 32)
#define MSG_MAX_LINE 128
@@ -873,8 +876,12 @@ int __init early_xdbc_init(char *s)
{
u32 bus = 0, dev = 0, func = 0;
unsigned long dbgp_num = 0;
+ char *ping = "Press Y to continue...\n";
+ char pong[64];
+ size_t size;
u32 offset;
int ret;
+ int retry = 20;
if (!early_pci_allowed())
return -EPERM;
@@ -917,6 +924,21 @@ int __init early_xdbc_init(char *s)
return ret;
}
+ while (retry > 0) {
+ early_xdbc_write(NULL, ping, strlen(ping));
+ size = early_xdbc_read(NULL, pong, 64);
+ if (size > 0) {
+ xdbc_trace("%s: pong message: %s\n", __func__, pong);
+ if (pong[0] == 'Y' || pong[0] == 'y')
+ break;
+ } else {
+ xdbc_trace("%s: pong message error %d\n",
+ __func__, size);
+ }
+
+ retry--;
+ }
+
return 0;
}
@@ -1338,6 +1360,11 @@ int xdbc_bulk_write(const char *bytes, int size)
* Start a bulk-in or bulk-out transfer, wait until transfer completion
* or error. Return the count of actually transferred bytes or error.
*/
+static int early_xdbc_read(struct console *con, char *str, unsigned n)
+{
+ return xdbc_bulk_read(str, n, 0);
+}
+
static void early_xdbc_write(struct console *con, const char *str, u32 n)
{
int chunk, ret;
--
2.1.4
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists