From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965248AbbJ1IDX (ORCPT ); Wed, 28 Oct 2015 04:03:23 -0400 Received: from mga02.intel.com ([134.134.136.20]:5991 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S965127AbbJ1IBk (ORCPT ); Wed, 28 Oct 2015 04:01:40 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.20,209,1444719600"; d="scan'208";a="673346154" From: Lu Baolu To: Mathias Nyman , Greg Kroah-Hartman , Alan Stern Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Lu Baolu Subject: [PATCH 10/12] usb: xhci: dbc: add handshake between debug target and host Date: Wed, 28 Oct 2015 16:00:41 +0800 Message-Id: <1446019243-5565-11-git-send-email-baolu.lu@linux.intel.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1446019243-5565-1-git-send-email-baolu.lu@linux.intel.com> References: <1446019243-5565-1-git-send-email-baolu.lu@linux.intel.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- 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