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...@linux.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 6c24ba0..37c5c87 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
@@ -860,8 +863,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;
@@ -904,6 +911,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;
 }
 
@@ -1325,6 +1347,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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to