aboutsummaryrefslogtreecommitdiffstats
path: root/usb
diff options
authorGreg Kroah-Hartman <gregkh@suse.de>2009-08-19 16:44:29 -0700
committerGreg Kroah-Hartman <gregkh@suse.de>2009-08-19 16:44:29 -0700
commitbd43dd37720db9b7a65b2bf06a0b9c9f523630d0 (patch)
tree64876676cf2948f0283fd2bb2c1d639823760026 /usb
parent61c6bd8febccb4ad734226a9782a3ae27db1017c (diff)
downloadpatches-bd43dd37720db9b7a65b2bf06a0b9c9f523630d0.tar.gz
remove ehci printk stuff, it breaks -tip
Diffstat (limited to 'usb')
-rw-r--r--usb/usb-early_printk-ehci-debug-controller-initialization-delays.patch152
-rw-r--r--usb/usb-early_printk-insert-cr-prior-to-nl-as-needed.patch63
-rw-r--r--usb/usb-ehci-dbgp-execute-early-bios-hand-off.patch91
-rw-r--r--usb/usb-ehci-dbgp-stability-improvements-and-external-re-init.patch680
-rw-r--r--usb/usb-ehci-early_printk-split-ehci-debug-driver-from-early_printk.c.patch1513
-rw-r--r--usb/usb-printk-early_printk-console-allow-more-than-one-early-console.patch199
6 files changed, 0 insertions, 2698 deletions
diff --git a/usb/usb-early_printk-ehci-debug-controller-initialization-delays.patch b/usb/usb-early_printk-ehci-debug-controller-initialization-delays.patch
deleted file mode 100644
index 2b0adc1ef1a326..00000000000000
--- a/usb/usb-early_printk-ehci-debug-controller-initialization-delays.patch
+++ /dev/null
@@ -1,152 +0,0 @@
-From jason.wessel@windriver.com Tue Aug 18 10:45:24 2009
-From: Jason Wessel <jason.wessel@windriver.com>
-Date: Fri, 31 Jul 2009 10:07:07 -0500
-Subject: USB: early_printk: EHCI debug controller initialization delays
-To: gregkh@suse.de
-Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Jason Wessel <jason.wessel@windriver.com>, Ingo Molnar <mingo@elte.hu>, Andrew Morton <akpm@linux-foundation.org>, Yinghai Lu <yinghai@kernel.org>, "Eric W. Biederman" <ebiederm@xmission.com>
-Message-ID: <1249052833-9655-5-git-send-email-jason.wessel@windriver.com>
-
-
-When using the EHCI host controller as a polled device, a bit more
-tolerance is required in terms of delays. On some 3+ghz systems the
-cpu loops were faster than the EHCI device mmio and resulted in the
-controller failing to initialize.
-
-On at least one first generation EHCI controller when it was not
-operating in interrupt mode, it would fail to report a port change
-status, but executing the port reset allowed the debug controller to
-work correctly anyway. This errata causes a one time 300ms delay in
-the boot time, where as the typical delay is 1-5ms for an EHCI
-controller that does not have this errata.
-
-The debug printk's were fixed to have the correct state messages, and
-there was a conversion from using early_printk to printk to avoid
-calling the dbgp driver while debugging the initialization.
-
-Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
-Cc: Ingo Molnar <mingo@elte.hu>
-Cc: Andrew Morton <akpm@linux-foundation.org>
-Cc: Yinghai Lu <yinghai@kernel.org>
-Cc: "Eric W. Biederman" <ebiederm@xmission.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-
----
- drivers/usb/early/ehci-dbgp.c | 45 ++++++++++++++++++++++++------------------
- 1 file changed, 26 insertions(+), 19 deletions(-)
-
---- a/drivers/usb/early/ehci-dbgp.c
-+++ b/drivers/usb/early/ehci-dbgp.c
-@@ -9,6 +9,12 @@
- #include <asm/pci-direct.h>
- #include <asm/fixmap.h>
-
-+#ifdef DBGP_DEBUG
-+# define dbgp_printk printk
-+#else
-+static inline void dbgp_printk(const char *fmt, ...) { }
-+#endif
-+
- static struct ehci_caps __iomem *ehci_caps;
- static struct ehci_regs __iomem *ehci_regs;
- static struct ehci_dbg_port __iomem *ehci_debug;
-@@ -342,6 +348,7 @@ static int __init ehci_reset_port(int po
- u32 delay_time, delay;
- int loop;
-
-+ dbgp_printk("ehci_reset_port %i\n", port);
- /* Reset the usb debug port */
- portsc = readl(&ehci_regs->port_status[port - 1]);
- portsc &= ~PORT_PE;
-@@ -352,14 +359,17 @@ static int __init ehci_reset_port(int po
- for (delay_time = 0; delay_time < HUB_RESET_TIMEOUT;
- delay_time += delay) {
- dbgp_mdelay(delay);
--
- portsc = readl(&ehci_regs->port_status[port - 1]);
-+ if (!(portsc & PORT_RESET))
-+ break;
-+ }
- if (portsc & PORT_RESET) {
- /* force reset to complete */
-- loop = 2;
-+ loop = 100 * 1000;
- writel(portsc & ~(PORT_RWC_BITS | PORT_RESET),
- &ehci_regs->port_status[port - 1]);
- do {
-+ udelay(1);
- portsc = readl(&ehci_regs->port_status[port-1]);
- } while ((portsc & PORT_RESET) && (--loop > 0));
- }
-@@ -375,7 +385,6 @@ static int __init ehci_reset_port(int po
- /* If we've finished resetting, then break out of the loop */
- if (!(portsc & PORT_RESET) && (portsc & PORT_PE))
- return 0;
-- }
- return -EBUSY;
- }
-
-@@ -384,24 +393,18 @@ static int __init ehci_wait_for_port(int
- u32 status;
- int ret, reps;
-
-- for (reps = 0; reps < 3; reps++) {
-- dbgp_mdelay(100);
-+ for (reps = 0; reps < 300; reps++) {
- status = readl(&ehci_regs->status);
-- if (status & STS_PCD) {
-- ret = ehci_reset_port(port);
-- if (ret == 0)
-- return 0;
-- }
-+ if (status & STS_PCD)
-+ break;
-+ dbgp_mdelay(1);
- }
-+ ret = ehci_reset_port(port);
-+ if (ret == 0)
-+ return 0;
- return -ENOTCONN;
- }
-
--#ifdef DBGP_DEBUG
--# define dbgp_printk early_printk
--#else
--static inline void dbgp_printk(const char *fmt, ...) { }
--#endif
--
- typedef void (*set_debug_port_t)(int port);
-
- static void __init default_set_debug_port(int port)
-@@ -520,7 +523,7 @@ try_next_port:
- return -1;
- }
-
-- loop = 10;
-+ loop = 250 * 1000;
- /* Reset the EHCI controller */
- cmd = readl(&ehci_regs->command);
- cmd |= CMD_RESET;
-@@ -540,6 +543,7 @@ try_next_port:
- ctrl |= DBGP_OWNER;
- ctrl &= ~(DBGP_ENABLED | DBGP_INUSE);
- writel(ctrl, &ehci_debug->control);
-+ udelay(1);
-
- /* Start the ehci running */
- cmd = readl(&ehci_regs->command);
-@@ -554,10 +558,13 @@ try_next_port:
- loop = 10;
- do {
- status = readl(&ehci_regs->status);
-- } while ((status & STS_HALT) && (--loop > 0));
-+ if (!(status & STS_HALT))
-+ break;
-+ udelay(1);
-+ } while (--loop > 0);
-
- if (!loop) {
-- dbgp_printk("ehci can be started\n");
-+ dbgp_printk("ehci can not be started\n");
- return -1;
- }
- dbgp_printk("ehci started\n");
diff --git a/usb/usb-early_printk-insert-cr-prior-to-nl-as-needed.patch b/usb/usb-early_printk-insert-cr-prior-to-nl-as-needed.patch
deleted file mode 100644
index b0d4db4c6b4c80..00000000000000
--- a/usb/usb-early_printk-insert-cr-prior-to-nl-as-needed.patch
+++ /dev/null
@@ -1,63 +0,0 @@
-From jason.wessel@windriver.com Tue Aug 18 10:44:42 2009
-From: Jason Wessel <jason.wessel@windriver.com>
-Date: Fri, 31 Jul 2009 10:07:05 -0500
-Subject: USB: early_printk: insert cr prior to nl as needed
-To: gregkh@suse.de
-Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Jason Wessel <jason.wessel@windriver.com>, Ingo Molnar <mingo@elte.hu>, Andrew Morton <akpm@linux-foundation.org>, Yinghai Lu <yinghai@kernel.org>, "Eric W. Biederman" <ebiederm@xmission.com>
-Message-ID: <1249052833-9655-3-git-send-email-jason.wessel@windriver.com>
-
-
-The rs232 drivers send a carriage return prior to a new line in the
-early printk code.
-
-The usb debug driver should do the same because you want to be able to
-use the same terminal programs and tools for analysis of early printk
-data.
-
-Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
-Cc: Ingo Molnar <mingo@elte.hu>
-Cc: Andrew Morton <akpm@linux-foundation.org>
-Cc: Yinghai Lu <yinghai@kernel.org>
-Cc: "Eric W. Biederman" <ebiederm@xmission.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-
----
- drivers/usb/early/ehci-dbgp.c | 22 ++++++++++++++++------
- 1 file changed, 16 insertions(+), 6 deletions(-)
-
---- a/drivers/usb/early/ehci-dbgp.c
-+++ b/drivers/usb/early/ehci-dbgp.c
-@@ -700,17 +700,27 @@ int __init early_dbgp_init(char *s)
- static void early_dbgp_write(struct console *con, const char *str, u32 n)
- {
- int chunk, ret;
-+ char buf[DBGP_MAX_PACKET];
-+ int use_cr = 0;
-
- if (!ehci_debug)
- return;
- while (n > 0) {
-- chunk = n;
-- if (chunk > DBGP_MAX_PACKET)
-- chunk = DBGP_MAX_PACKET;
-+ for (chunk = 0; chunk < DBGP_MAX_PACKET && n > 0;
-+ str++, chunk++, n--) {
-+ if (!use_cr && *str == '\n') {
-+ use_cr = 1;
-+ buf[chunk] = '\r';
-+ str--;
-+ n++;
-+ continue;
-+ }
-+ if (use_cr)
-+ use_cr = 0;
-+ buf[chunk] = *str;
-+ }
- ret = dbgp_bulk_write(USB_DEBUG_DEVNUM,
-- dbgp_endpoint_out, str, chunk);
-- str += chunk;
-- n -= chunk;
-+ dbgp_endpoint_out, buf, chunk);
- }
- }
-
diff --git a/usb/usb-ehci-dbgp-execute-early-bios-hand-off.patch b/usb/usb-ehci-dbgp-execute-early-bios-hand-off.patch
deleted file mode 100644
index f5719d66a93610..00000000000000
--- a/usb/usb-ehci-dbgp-execute-early-bios-hand-off.patch
+++ /dev/null
@@ -1,91 +0,0 @@
-From jason.wessel@windriver.com Tue Aug 18 10:45:00 2009
-From: Jason Wessel <jason.wessel@windriver.com>
-Date: Fri, 31 Jul 2009 10:07:06 -0500
-Subject: USB: ehci-dbgp: Execute early BIOS hand off
-To: gregkh@suse.de
-Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Jason Wessel <jason.wessel@windriver.com>, Ingo Molnar <mingo@elte.hu>, Andrew Morton <akpm@linux-foundation.org>, dbrownell@users.sourceforge.net, Yinghai Lu <yinghai@kernel.org>, "Eric W. Biederman" <ebiederm@xmission.com>
-Message-ID: <1249052833-9655-4-git-send-email-jason.wessel@windriver.com>
-
-
-The PCI quirk code executes a BIOS hand off to obtain full control of
-the EHCI host controller, the self contained ehci-dbgp driver must do
-the same thing using the early PCI API, else the BIOS can cause a
-fatal fault.
-
-Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
-Cc: Ingo Molnar <mingo@elte.hu>
-Cc: Andrew Morton <akpm@linux-foundation.org>
-Cc: dbrownell@users.sourceforge.net
-Cc: Yinghai Lu <yinghai@kernel.org>
-Cc: "Eric W. Biederman" <ebiederm@xmission.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-
----
- drivers/usb/early/ehci-dbgp.c | 49 ++++++++++++++++++++++++++++++++++++++++++
- 1 file changed, 49 insertions(+)
-
---- a/drivers/usb/early/ehci-dbgp.c
-+++ b/drivers/usb/early/ehci-dbgp.c
-@@ -435,6 +435,53 @@ static void __init detect_set_debug_port
- }
- }
-
-+/* The code in early_ehci_bios_handoff() is derived from the usb pci
-+ * quirk initialization, but altered so as to use the early PCI
-+ * routines. */
-+#define EHCI_USBLEGSUP_BIOS (1 << 16) /* BIOS semaphore */
-+#define EHCI_USBLEGCTLSTS 4 /* legacy control/status */
-+static void __init early_ehci_bios_handoff(void)
-+{
-+ u32 hcc_params = readl(&ehci_caps->hcc_params);
-+ int offset = (hcc_params >> 8) & 0xff;
-+ u32 cap;
-+ int msec;
-+
-+ if (!offset)
-+ return;
-+
-+ cap = read_pci_config(ehci_dev.bus, ehci_dev.slot,
-+ ehci_dev.func, offset);
-+ dbgp_printk("dbgp: ehci BIOS state %08x\n", cap);
-+
-+ if ((cap & 0xff) == 1 && (cap & EHCI_USBLEGSUP_BIOS)) {
-+ dbgp_printk("dbgp: BIOS handoff\n");
-+ write_pci_config_byte(ehci_dev.bus, ehci_dev.slot,
-+ ehci_dev.func, offset + 3, 1);
-+ }
-+
-+ /* if boot firmware now owns EHCI, spin till it hands it over. */
-+ msec = 1000;
-+ while ((cap & EHCI_USBLEGSUP_BIOS) && (msec > 0)) {
-+ mdelay(10);
-+ msec -= 10;
-+ cap = read_pci_config(ehci_dev.bus, ehci_dev.slot,
-+ ehci_dev.func, offset);
-+ }
-+
-+ if (cap & EHCI_USBLEGSUP_BIOS) {
-+ /* well, possibly buggy BIOS... try to shut it down,
-+ * and hope nothing goes too wrong */
-+ dbgp_printk("dbgp: BIOS handoff failed: %08x\n", cap);
-+ write_pci_config_byte(ehci_dev.bus, ehci_dev.slot,
-+ ehci_dev.func, offset + 2, 0);
-+ }
-+
-+ /* just in case, always disable EHCI SMIs */
-+ write_pci_config_byte(ehci_dev.bus, ehci_dev.slot, ehci_dev.func,
-+ offset + EHCI_USBLEGCTLSTS, 0);
-+}
-+
- static int __init ehci_setup(void)
- {
- struct usb_debug_descriptor dbgp_desc;
-@@ -446,6 +493,8 @@ static int __init ehci_setup(void)
- int port_map_tried;
- int playtimes = 3;
-
-+ early_ehci_bios_handoff();
-+
- try_next_time:
- port_map_tried = 0;
-
diff --git a/usb/usb-ehci-dbgp-stability-improvements-and-external-re-init.patch b/usb/usb-ehci-dbgp-stability-improvements-and-external-re-init.patch
deleted file mode 100644
index a0af1b7e99d34f..00000000000000
--- a/usb/usb-ehci-dbgp-stability-improvements-and-external-re-init.patch
+++ /dev/null
@@ -1,680 +0,0 @@
-From jason.wessel@windriver.com Tue Aug 18 10:46:47 2009
-From: Jason Wessel <jason.wessel@windriver.com>
-Date: Fri, 31 Jul 2009 10:07:09 -0500
-Subject: USB: ehci-dbgp: stability improvements and external re-init
-To: gregkh@suse.de
-Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Jason Wessel <jason.wessel@windriver.com>, Ingo Molnar <mingo@elte.hu>, Andrew Morton <akpm@linux-foundation.org>, dbrownell@users.sourceforge.net, Yinghai Lu <yinghai@kernel.org>, "Eric W. Biederman" <ebiederm@xmission.com>
-Message-ID: <1249052833-9655-7-git-send-email-jason.wessel@windriver.com>
-
-
-This patch implements several changes:
-
-1) Improve the capability to debug the dbgp driver
-
- The dbgp_ehci_status() was added in a number of places to report
- the critical ehci registers to diagnose the cause of a failure of
- the ehci-dbgp driver.
-
-2) Capability to survive the host controller initialization
-
- The dbgp_external_startup(), dbgp_not_safe, and dbgp_phys_port were
- added so as to allow the ehci-dbgp to re-initialize after the ehci
- host controller is reset by the standard host controller driver.
- This same routine is common for the early startup or
- re-initialization.
-
- This resulted in the need to move some of the initialization code
- out of the __init section because the ehci driver has the
- possibility to be loaded later on as a kernel module.
-
-3) Stability improvements for device initialization
-
- The device enumeration from 0 to 127 has the possibility to fail
- the first time after a warm reset on some older EHCI debug
- controllers. The enumeration will be tried up to 3 times to
- account for this failure case.
-
- The dbg_wait_until_complete() was changed to wait up to 250 ms
- before failing which only comes into play during device
- initialization. The maximum delay will never get hit during the
- course of normal operation of the driver, unless the device got
- unplugged or there was a ehci controller failure, in which case the
- dbgp device driver will shut itself down.
-
-Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
-Cc: Ingo Molnar <mingo@elte.hu>
-Cc: Andrew Morton <akpm@linux-foundation.org>
-Cc: dbrownell@users.sourceforge.net
-Cc: Yinghai Lu <yinghai@kernel.org>
-Cc: "Eric W. Biederman" <ebiederm@xmission.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-
----
- drivers/usb/early/ehci-dbgp.c | 442 +++++++++++++++++++++++++++---------------
- include/linux/usb/ehci_def.h | 5
- 2 files changed, 299 insertions(+), 148 deletions(-)
-
---- a/drivers/usb/early/ehci-dbgp.c
-+++ b/drivers/usb/early/ehci-dbgp.c
-@@ -1,5 +1,19 @@
-+/*
-+ * Standalone EHCI usb debug driver
-+ *
-+ * Originally written by:
-+ * Eric W. Biederman" <ebiederm@xmission.com> and
-+ * Yinghai Lu <yhlu.kernel@gmail.com>
-+ *
-+ * Changes for early/late printk and HW errata:
-+ * Jason Wessel <jason.wessel@windriver.com>
-+ * Copyright (C) 2009 Wind River Systems, Inc.
-+ *
-+ */
-+
- #include <linux/console.h>
- #include <linux/errno.h>
-+#include <linux/module.h>
- #include <linux/pci_regs.h>
- #include <linux/pci_ids.h>
- #include <linux/usb/ch9.h>
-@@ -9,15 +23,37 @@
- #include <asm/pci-direct.h>
- #include <asm/fixmap.h>
-
--#ifdef DBGP_DEBUG
--# define dbgp_printk printk
--#else
--static inline void dbgp_printk(const char *fmt, ...) { }
--#endif
-+/* The code here is intended to talk directly to the EHCI debug port
-+ * and does not require that you have any kind of USB host controller
-+ * drivers or USB device drivers compiled into the kernel.
-+ *
-+ * If you make a change to anything in here, the following test cases
-+ * need to pass where a USB debug device works in the following
-+ * configurations.
-+ *
-+ * 1. boot args: earlyprintk=dbgp
-+ * o kernel compiled with # CONFIG_USB_EHCI_HCD is not set
-+ * o kernel compiled with CONFIG_USB_EHCI_HCD=y
-+ * 2. boot args: earlyprintk=dbgp,keep
-+ * o kernel compiled with # CONFIG_USB_EHCI_HCD is not set
-+ * o kernel compiled with CONFIG_USB_EHCI_HCD=y
-+ * 3. boot args: earlyprintk=dbgp console=ttyUSB0
-+ * o kernel has CONFIG_USB_EHCI_HCD=y and
-+ * CONFIG_USB_SERIAL_DEBUG=y
-+ * 4. boot args: earlyprintk=vga,dbgp
-+ * o kernel compiled with # CONFIG_USB_EHCI_HCD is not set
-+ * o kernel compiled with CONFIG_USB_EHCI_HCD=y
-+ *
-+ * For the 4th configuration you can turn on or off the DBGP_DEBUG
-+ * such that you can debug the dbgp device's driver code.
-+ */
-+
-+static int dbgp_phys_port = 1;
-
- static struct ehci_caps __iomem *ehci_caps;
- static struct ehci_regs __iomem *ehci_regs;
- static struct ehci_dbg_port __iomem *ehci_debug;
-+static int dbgp_not_safe; /* Cannot use debug device during ehci reset */
- static unsigned int dbgp_endpoint_out;
-
- struct ehci_dev {
-@@ -32,6 +68,26 @@ static struct ehci_dev ehci_dev;
-
- #define DBGP_DATA_TOGGLE 0x8800
-
-+#ifdef DBGP_DEBUG
-+#define dbgp_printk printk
-+static void dbgp_ehci_status(char *str)
-+{
-+ if (!ehci_debug)
-+ return;
-+ dbgp_printk("dbgp: %s\n", str);
-+ dbgp_printk(" Debug control: %08x", readl(&ehci_debug->control));
-+ dbgp_printk(" ehci cmd : %08x", readl(&ehci_regs->command));
-+ dbgp_printk(" ehci conf flg: %08x\n",
-+ readl(&ehci_regs->configured_flag));
-+ dbgp_printk(" ehci status : %08x", readl(&ehci_regs->status));
-+ dbgp_printk(" ehci portsc : %08x\n",
-+ readl(&ehci_regs->port_status[dbgp_phys_port - 1]));
-+}
-+#else
-+static inline void dbgp_ehci_status(char *str) { }
-+static inline void dbgp_printk(const char *fmt, ...) { }
-+#endif
-+
- static inline u32 dbgp_pid_update(u32 x, u32 tok)
- {
- return ((x ^ DBGP_DATA_TOGGLE) & 0xffff00) | (tok & 0xff);
-@@ -79,21 +135,23 @@ static inline u32 dbgp_len_update(u32 x,
- #define HUB_RESET_TIMEOUT 500
-
- #define DBGP_MAX_PACKET 8
-+#define DBGP_TIMEOUT (250 * 1000)
-
- static int dbgp_wait_until_complete(void)
- {
- u32 ctrl;
-- int loop = 0x100000;
-+ int loop = DBGP_TIMEOUT;
-
- do {
- ctrl = readl(&ehci_debug->control);
- /* Stop when the transaction is finished */
- if (ctrl & DBGP_DONE)
- break;
-+ udelay(1);
- } while (--loop > 0);
-
- if (!loop)
-- return -1;
-+ return -DBGP_TIMEOUT;
-
- /*
- * Now that we have observed the completed transaction,
-@@ -103,7 +161,7 @@ static int dbgp_wait_until_complete(void
- return (ctrl & DBGP_ERROR) ? -DBGP_ERRCODE(ctrl) : DBGP_LEN(ctrl);
- }
-
--static void __init dbgp_mdelay(int ms)
-+static inline void dbgp_mdelay(int ms)
- {
- int i;
-
-@@ -130,8 +188,17 @@ retry:
- pids = readl(&ehci_debug->pids);
- lpid = DBGP_PID_GET(pids);
-
-- if (ret < 0)
-+ if (ret < 0) {
-+ /* A -DBGP_TIMEOUT failure here means the device has
-+ * failed, perhaps because it was unplugged, in which
-+ * case we do not want to hang the system so the dbgp
-+ * will be marked as unsafe to use. EHCI reset is the
-+ * only way to recover if you unplug the dbgp device.
-+ */
-+ if (ret == -DBGP_TIMEOUT && !dbgp_not_safe)
-+ dbgp_not_safe = 1;
- return ret;
-+ }
-
- /*
- * If the port is getting full or it has dropped data
-@@ -149,7 +216,7 @@ retry:
- return ret;
- }
-
--static void dbgp_set_data(const void *buf, int size)
-+static inline void dbgp_set_data(const void *buf, int size)
- {
- const unsigned char *bytes = buf;
- u32 lo, hi;
-@@ -164,7 +231,7 @@ static void dbgp_set_data(const void *bu
- writel(hi, &ehci_debug->data47);
- }
-
--static void __init dbgp_get_data(void *buf, int size)
-+static inline void dbgp_get_data(void *buf, int size)
- {
- unsigned char *bytes = buf;
- u32 lo, hi;
-@@ -208,7 +275,7 @@ static int dbgp_bulk_write(unsigned devn
- return ret;
- }
-
--static int __init dbgp_bulk_read(unsigned devnum, unsigned endpoint, void *data,
-+static int dbgp_bulk_read(unsigned devnum, unsigned endpoint, void *data,
- int size)
- {
- u32 pids, addr, ctrl;
-@@ -239,7 +306,7 @@ static int __init dbgp_bulk_read(unsigne
- return ret;
- }
-
--static int __init dbgp_control_msg(unsigned devnum, int requesttype,
-+static int dbgp_control_msg(unsigned devnum, int requesttype,
- int request, int value, int index, void *data, int size)
- {
- u32 pids, addr, ctrl;
-@@ -342,13 +409,179 @@ static u32 __init find_dbgp(int ehci_num
- return 0;
- }
-
-+static int dbgp_ehci_startup(void)
-+{
-+ u32 ctrl, cmd, status;
-+ int loop;
-+
-+ /* Claim ownership, but do not enable yet */
-+ ctrl = readl(&ehci_debug->control);
-+ ctrl |= DBGP_OWNER;
-+ ctrl &= ~(DBGP_ENABLED | DBGP_INUSE);
-+ writel(ctrl, &ehci_debug->control);
-+ udelay(1);
-+
-+ dbgp_ehci_status("EHCI startup");
-+ /* Start the ehci running */
-+ cmd = readl(&ehci_regs->command);
-+ cmd &= ~(CMD_LRESET | CMD_IAAD | CMD_PSE | CMD_ASE | CMD_RESET);
-+ cmd |= CMD_RUN;
-+ writel(cmd, &ehci_regs->command);
-+
-+ /* Ensure everything is routed to the EHCI */
-+ writel(FLAG_CF, &ehci_regs->configured_flag);
-+
-+ /* Wait until the controller is no longer halted */
-+ loop = 10;
-+ do {
-+ status = readl(&ehci_regs->status);
-+ if (!(status & STS_HALT))
-+ break;
-+ udelay(1);
-+ } while (--loop > 0);
-+
-+ if (!loop) {
-+ dbgp_printk("ehci can not be started\n");
-+ return -ENODEV;
-+ }
-+ dbgp_printk("ehci started\n");
-+ return 0;
-+}
-+
-+static int dbgp_ehci_controller_reset(void)
-+{
-+ int loop = 250 * 1000;
-+ u32 cmd;
-+
-+ /* Reset the EHCI controller */
-+ cmd = readl(&ehci_regs->command);
-+ cmd |= CMD_RESET;
-+ writel(cmd, &ehci_regs->command);
-+ do {
-+ cmd = readl(&ehci_regs->command);
-+ } while ((cmd & CMD_RESET) && (--loop > 0));
-+
-+ if (!loop) {
-+ dbgp_printk("can not reset ehci\n");
-+ return -1;
-+ }
-+ dbgp_ehci_status("ehci reset done");
-+ return 0;
-+}
-+static int ehci_wait_for_port(int port);
-+/* Return 0 on success
-+ * Return -ENODEV for any general failure
-+ * Return -EIO if wait for port fails
-+ */
-+int dbgp_external_startup(void)
-+{
-+ int devnum;
-+ struct usb_debug_descriptor dbgp_desc;
-+ int ret;
-+ u32 ctrl, portsc;
-+ int dbg_port = dbgp_phys_port;
-+ int tries = 3;
-+
-+ ret = dbgp_ehci_startup();
-+ if (ret)
-+ return ret;
-+
-+ /* Wait for a device to show up in the debug port */
-+ ret = ehci_wait_for_port(dbg_port);
-+ if (ret < 0) {
-+ portsc = readl(&ehci_regs->port_status[dbg_port - 1]);
-+ dbgp_printk("No device found in debug port\n");
-+ return -EIO;
-+ }
-+ dbgp_ehci_status("wait for port done");
-+
-+ /* Enable the debug port */
-+ ctrl = readl(&ehci_debug->control);
-+ ctrl |= DBGP_CLAIM;
-+ writel(ctrl, &ehci_debug->control);
-+ ctrl = readl(&ehci_debug->control);
-+ if ((ctrl & DBGP_CLAIM) != DBGP_CLAIM) {
-+ dbgp_printk("No device in debug port\n");
-+ writel(ctrl & ~DBGP_CLAIM, &ehci_debug->control);
-+ return -ENODEV;
-+ }
-+ dbgp_ehci_status("debug ported enabled");
-+
-+ /* Completely transfer the debug device to the debug controller */
-+ portsc = readl(&ehci_regs->port_status[dbg_port - 1]);
-+ portsc &= ~PORT_PE;
-+ writel(portsc, &ehci_regs->port_status[dbg_port - 1]);
-+
-+ dbgp_mdelay(100);
-+
-+try_again:
-+ /* Find the debug device and make it device number 127 */
-+ for (devnum = 0; devnum <= 127; devnum++) {
-+ ret = dbgp_control_msg(devnum,
-+ USB_DIR_IN | USB_TYPE_STANDARD | USB_RECIP_DEVICE,
-+ USB_REQ_GET_DESCRIPTOR, (USB_DT_DEBUG << 8), 0,
-+ &dbgp_desc, sizeof(dbgp_desc));
-+ if (ret > 0)
-+ break;
-+ }
-+ if (devnum > 127) {
-+ dbgp_printk("Could not find attached debug device\n");
-+ goto err;
-+ }
-+ if (ret < 0) {
-+ dbgp_printk("Attached device is not a debug device\n");
-+ goto err;
-+ }
-+ dbgp_endpoint_out = dbgp_desc.bDebugOutEndpoint;
-+
-+ /* Move the device to 127 if it isn't already there */
-+ if (devnum != USB_DEBUG_DEVNUM) {
-+ ret = dbgp_control_msg(devnum,
-+ USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE,
-+ USB_REQ_SET_ADDRESS, USB_DEBUG_DEVNUM, 0, NULL, 0);
-+ if (ret < 0) {
-+ dbgp_printk("Could not move attached device to %d\n",
-+ USB_DEBUG_DEVNUM);
-+ goto err;
-+ }
-+ devnum = USB_DEBUG_DEVNUM;
-+ dbgp_printk("debug device renamed to 127\n");
-+ }
-+
-+ /* Enable the debug interface */
-+ ret = dbgp_control_msg(USB_DEBUG_DEVNUM,
-+ USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE,
-+ USB_REQ_SET_FEATURE, USB_DEVICE_DEBUG_MODE, 0, NULL, 0);
-+ if (ret < 0) {
-+ dbgp_printk(" Could not enable the debug device\n");
-+ goto err;
-+ }
-+ dbgp_printk("debug interface enabled\n");
-+ /* Perform a small write to get the even/odd data state in sync
-+ */
-+ ret = dbgp_bulk_write(USB_DEBUG_DEVNUM, dbgp_endpoint_out, " ", 1);
-+ if (ret < 0) {
-+ dbgp_printk("dbgp_bulk_write failed: %d\n", ret);
-+ goto err;
-+ }
-+ dbgp_printk("small write doned\n");
-+ dbgp_not_safe = 0;
-+
-+ return 0;
-+err:
-+ if (tries--)
-+ goto try_again;
-+ return -ENODEV;
-+}
-+EXPORT_SYMBOL_GPL(dbgp_external_startup);
-+
- static int __init ehci_reset_port(int port)
- {
- u32 portsc;
- u32 delay_time, delay;
- int loop;
-
-- dbgp_printk("ehci_reset_port %i\n", port);
-+ dbgp_ehci_status("reset port");
- /* Reset the usb debug port */
- portsc = readl(&ehci_regs->port_status[port - 1]);
- portsc &= ~PORT_PE;
-@@ -388,7 +621,7 @@ static int __init ehci_reset_port(int po
- return -EBUSY;
- }
-
--static int __init ehci_wait_for_port(int port)
-+static int ehci_wait_for_port(int port)
- {
- u32 status;
- int ret, reps;
-@@ -487,12 +720,9 @@ static void __init early_ehci_bios_hando
-
- static int __init ehci_setup(void)
- {
-- struct usb_debug_descriptor dbgp_desc;
-- u32 cmd, ctrl, status, portsc, hcs_params;
-+ u32 ctrl, portsc, hcs_params;
- u32 debug_port, new_debug_port = 0, n_ports;
-- u32 devnum;
- int ret, i;
-- int loop;
- int port_map_tried;
- int playtimes = 3;
-
-@@ -505,10 +735,12 @@ try_next_port:
-
- hcs_params = readl(&ehci_caps->hcs_params);
- debug_port = HCS_DEBUG_PORT(hcs_params);
-+ dbgp_phys_port = debug_port;
- n_ports = HCS_N_PORTS(hcs_params);
-
- dbgp_printk("debug_port: %d\n", debug_port);
- dbgp_printk("n_ports: %d\n", n_ports);
-+ dbgp_ehci_status("");
-
- for (i = 1; i <= n_ports; i++) {
- portsc = readl(&ehci_regs->port_status[i-1]);
-@@ -523,138 +755,27 @@ try_next_port:
- return -1;
- }
-
-- loop = 250 * 1000;
-- /* Reset the EHCI controller */
-- cmd = readl(&ehci_regs->command);
-- cmd |= CMD_RESET;
-- writel(cmd, &ehci_regs->command);
-- do {
-- cmd = readl(&ehci_regs->command);
-- } while ((cmd & CMD_RESET) && (--loop > 0));
--
-- if (!loop) {
-- dbgp_printk("can not reset ehci\n");
-- return -1;
-- }
-- dbgp_printk("ehci reset done\n");
--
-- /* Claim ownership, but do not enable yet */
-- ctrl = readl(&ehci_debug->control);
-- ctrl |= DBGP_OWNER;
-- ctrl &= ~(DBGP_ENABLED | DBGP_INUSE);
-- writel(ctrl, &ehci_debug->control);
-- udelay(1);
--
-- /* Start the ehci running */
-- cmd = readl(&ehci_regs->command);
-- cmd &= ~(CMD_LRESET | CMD_IAAD | CMD_PSE | CMD_ASE | CMD_RESET);
-- cmd |= CMD_RUN;
-- writel(cmd, &ehci_regs->command);
--
-- /* Ensure everything is routed to the EHCI */
-- writel(FLAG_CF, &ehci_regs->configured_flag);
--
-- /* Wait until the controller is no longer halted */
-- loop = 10;
-- do {
-- status = readl(&ehci_regs->status);
-- if (!(status & STS_HALT))
-- break;
-- udelay(1);
-- } while (--loop > 0);
--
-- if (!loop) {
-- dbgp_printk("ehci can not be started\n");
-- return -1;
-+ /* Only reset the controller if it is not already in the
-+ * configured state */
-+ if (!(readl(&ehci_regs->configured_flag) & FLAG_CF)) {
-+ if (dbgp_ehci_controller_reset() != 0)
-+ return -1;
-+ } else {
-+ dbgp_ehci_status("ehci skip - already configured");
- }
-- dbgp_printk("ehci started\n");
-
-- /* Wait for a device to show up in the debug port */
-- ret = ehci_wait_for_port(debug_port);
-- if (ret < 0) {
-- dbgp_printk("No device found in debug port\n");
-+ ret = dbgp_external_startup();
-+ if (ret == -EIO)
- goto next_debug_port;
-- }
-- dbgp_printk("ehci wait for port done\n");
--
-- /* Enable the debug port */
-- ctrl = readl(&ehci_debug->control);
-- ctrl |= DBGP_CLAIM;
-- writel(ctrl, &ehci_debug->control);
-- ctrl = readl(&ehci_debug->control);
-- if ((ctrl & DBGP_CLAIM) != DBGP_CLAIM) {
-- dbgp_printk("No device in debug port\n");
-- writel(ctrl & ~DBGP_CLAIM, &ehci_debug->control);
-- goto err;
-- }
-- dbgp_printk("debug ported enabled\n");
-
-- /* Completely transfer the debug device to the debug controller */
-- portsc = readl(&ehci_regs->port_status[debug_port - 1]);
-- portsc &= ~PORT_PE;
-- writel(portsc, &ehci_regs->port_status[debug_port - 1]);
--
-- dbgp_mdelay(100);
--
-- /* Find the debug device and make it device number 127 */
-- for (devnum = 0; devnum <= 127; devnum++) {
-- ret = dbgp_control_msg(devnum,
-- USB_DIR_IN | USB_TYPE_STANDARD | USB_RECIP_DEVICE,
-- USB_REQ_GET_DESCRIPTOR, (USB_DT_DEBUG << 8), 0,
-- &dbgp_desc, sizeof(dbgp_desc));
-- if (ret > 0)
-- break;
-- }
-- if (devnum > 127) {
-- dbgp_printk("Could not find attached debug device\n");
-- goto err;
-- }
- if (ret < 0) {
-- dbgp_printk("Attached device is not a debug device\n");
-- goto err;
-- }
-- dbgp_endpoint_out = dbgp_desc.bDebugOutEndpoint;
--
-- /* Move the device to 127 if it isn't already there */
-- if (devnum != USB_DEBUG_DEVNUM) {
-- ret = dbgp_control_msg(devnum,
-- USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE,
-- USB_REQ_SET_ADDRESS, USB_DEBUG_DEVNUM, 0, NULL, 0);
-- if (ret < 0) {
-- dbgp_printk("Could not move attached device to %d\n",
-- USB_DEBUG_DEVNUM);
-- goto err;
-- }
-- devnum = USB_DEBUG_DEVNUM;
-- dbgp_printk("debug device renamed to 127\n");
-- }
--
-- /* Enable the debug interface */
-- ret = dbgp_control_msg(USB_DEBUG_DEVNUM,
-- USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE,
-- USB_REQ_SET_FEATURE, USB_DEVICE_DEBUG_MODE, 0, NULL, 0);
-- if (ret < 0) {
-- dbgp_printk(" Could not enable the debug device\n");
-- goto err;
-- }
-- dbgp_printk("debug interface enabled\n");
--
-- /* Perform a small write to get the even/odd data state in sync
-- */
-- ret = dbgp_bulk_write(USB_DEBUG_DEVNUM, dbgp_endpoint_out, " ", 1);
-- if (ret < 0) {
-- dbgp_printk("dbgp_bulk_write failed: %d\n", ret);
-- goto err;
-+ /* Things didn't work so remove my claim */
-+ ctrl = readl(&ehci_debug->control);
-+ ctrl &= ~(DBGP_CLAIM | DBGP_OUT);
-+ writel(ctrl, &ehci_debug->control);
-+ return -1;
- }
-- dbgp_printk("small write doned\n");
--
- return 0;
--err:
-- /* Things didn't work so remove my claim */
-- ctrl = readl(&ehci_debug->control);
-- ctrl &= ~(DBGP_CLAIM | DBGP_OUT);
-- writel(ctrl, &ehci_debug->control);
-- return -1;
-
- next_debug_port:
- port_map_tried |= (1<<(debug_port - 1));
-@@ -749,6 +870,7 @@ int __init early_dbgp_init(char *s)
-
- return -1;
- }
-+ dbgp_ehci_status("early_init_complete");
-
- return 0;
- }
-@@ -758,9 +880,27 @@ static void early_dbgp_write(struct cons
- int chunk, ret;
- char buf[DBGP_MAX_PACKET];
- int use_cr = 0;
-+ u32 cmd, ctrl;
-+ int reset_run = 0;
-
-- if (!ehci_debug)
-+ if (!ehci_debug || dbgp_not_safe)
- return;
-+
-+ cmd = readl(&ehci_regs->command);
-+ if (unlikely(!(cmd & CMD_RUN))) {
-+ /* If the ehci controller is not in the run state do extended
-+ * checks to see if the acpi or some other initialization also
-+ * reset the ehci debug port */
-+ ctrl = readl(&ehci_debug->control);
-+ if (!(ctrl & DBGP_ENABLED)) {
-+ dbgp_not_safe = 1;
-+ dbgp_external_startup();
-+ } else {
-+ cmd |= CMD_RUN;
-+ writel(cmd, &ehci_regs->command);
-+ reset_run = 1;
-+ }
-+ }
- while (n > 0) {
- for (chunk = 0; chunk < DBGP_MAX_PACKET && n > 0;
- str++, chunk++, n--) {
-@@ -775,8 +915,15 @@ static void early_dbgp_write(struct cons
- use_cr = 0;
- buf[chunk] = *str;
- }
-- ret = dbgp_bulk_write(USB_DEBUG_DEVNUM,
-- dbgp_endpoint_out, buf, chunk);
-+ if (chunk > 0) {
-+ ret = dbgp_bulk_write(USB_DEBUG_DEVNUM,
-+ dbgp_endpoint_out, buf, chunk);
-+ }
-+ }
-+ if (unlikely(reset_run)) {
-+ cmd = readl(&ehci_regs->command);
-+ cmd &= ~CMD_RUN;
-+ writel(cmd, &ehci_regs->command);
- }
- }
-
-@@ -786,4 +933,3 @@ struct console early_dbgp_console = {
- .flags = CON_PRINTBUFFER,
- .index = -1,
- };
--
---- a/include/linux/usb/ehci_def.h
-+++ b/include/linux/usb/ehci_def.h
-@@ -176,4 +176,9 @@ extern int __init early_dbgp_init(char *
- extern struct console early_dbgp_console;
- #endif /* CONFIG_EARLY_PRINTK_DBGP */
-
-+#ifdef CONFIG_EARLY_PRINTK_DBGP
-+/* Call backs from ehci host driver to ehci debug driver */
-+extern int dbgp_external_startup(void);
-+#endif
-+
- #endif /* __LINUX_USB_EHCI_DEF_H */
diff --git a/usb/usb-ehci-early_printk-split-ehci-debug-driver-from-early_printk.c.patch b/usb/usb-ehci-early_printk-split-ehci-debug-driver-from-early_printk.c.patch
deleted file mode 100644
index 2d43b978789ed2..00000000000000
--- a/usb/usb-ehci-early_printk-split-ehci-debug-driver-from-early_printk.c.patch
+++ /dev/null
@@ -1,1513 +0,0 @@
-From jason.wessel@windriver.com Tue Aug 18 10:44:19 2009
-From: Jason Wessel <jason.wessel@windriver.com>
-Date: Fri, 31 Jul 2009 10:07:04 -0500
-Subject: USB: ehci early_printk: split ehci debug driver from early_printk.c
-To: gregkh@suse.de
-Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Jason Wessel <jason.wessel@windriver.com>, Ingo Molnar <mingo@elte.hu>, Andrew Morton <akpm@linux-foundation.org>, Yinghai Lu <yinghai@kernel.org>, "Eric W. Biederman" <ebiederm@xmission.com>
-Message-ID: <1249052833-9655-2-git-send-email-jason.wessel@windriver.com>
-
-
-Move the dbgp early printk driver in advance of refactoring and adding
-new code, so the changes to this code are tracked separately from the
-move of the code.
-
-The drivers/usb/early directory will be the location of the current
-and future early usb code for driving usb devices prior initializing
-the standard interrupt driven USB drivers.
-
-Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
-Cc: Ingo Molnar <mingo@elte.hu>
-Cc: Andrew Morton <akpm@linux-foundation.org>
-Cc: Yinghai Lu <yinghai@kernel.org>
-Cc: "Eric W. Biederman" <ebiederm@xmission.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-
----
- arch/x86/kernel/early_printk.c | 715 ----------------------------------------
- drivers/usb/Makefile | 1
- drivers/usb/early/Makefile | 5
- drivers/usb/early/ehci-dbgp.c | 723 +++++++++++++++++++++++++++++++++++++++++
- include/linux/usb/ehci_def.h | 6
- 5 files changed, 735 insertions(+), 715 deletions(-)
-
---- a/arch/x86/kernel/early_printk.c
-+++ b/arch/x86/kernel/early_printk.c
-@@ -160,721 +160,6 @@ static struct console early_serial_conso
- .index = -1,
- };
-
--#ifdef CONFIG_EARLY_PRINTK_DBGP
--
--static struct ehci_caps __iomem *ehci_caps;
--static struct ehci_regs __iomem *ehci_regs;
--static struct ehci_dbg_port __iomem *ehci_debug;
--static unsigned int dbgp_endpoint_out;
--
--struct ehci_dev {
-- u32 bus;
-- u32 slot;
-- u32 func;
--};
--
--static struct ehci_dev ehci_dev;
--
--#define USB_DEBUG_DEVNUM 127
--
--#define DBGP_DATA_TOGGLE 0x8800
--
--static inline u32 dbgp_pid_update(u32 x, u32 tok)
--{
-- return ((x ^ DBGP_DATA_TOGGLE) & 0xffff00) | (tok & 0xff);
--}
--
--static inline u32 dbgp_len_update(u32 x, u32 len)
--{
-- return (x & ~0x0f) | (len & 0x0f);
--}
--
--/*
-- * USB Packet IDs (PIDs)
-- */
--
--/* token */
--#define USB_PID_OUT 0xe1
--#define USB_PID_IN 0x69
--#define USB_PID_SOF 0xa5
--#define USB_PID_SETUP 0x2d
--/* handshake */
--#define USB_PID_ACK 0xd2
--#define USB_PID_NAK 0x5a
--#define USB_PID_STALL 0x1e
--#define USB_PID_NYET 0x96
--/* data */
--#define USB_PID_DATA0 0xc3
--#define USB_PID_DATA1 0x4b
--#define USB_PID_DATA2 0x87
--#define USB_PID_MDATA 0x0f
--/* Special */
--#define USB_PID_PREAMBLE 0x3c
--#define USB_PID_ERR 0x3c
--#define USB_PID_SPLIT 0x78
--#define USB_PID_PING 0xb4
--#define USB_PID_UNDEF_0 0xf0
--
--#define USB_PID_DATA_TOGGLE 0x88
--#define DBGP_CLAIM (DBGP_OWNER | DBGP_ENABLED | DBGP_INUSE)
--
--#define PCI_CAP_ID_EHCI_DEBUG 0xa
--
--#define HUB_ROOT_RESET_TIME 50 /* times are in msec */
--#define HUB_SHORT_RESET_TIME 10
--#define HUB_LONG_RESET_TIME 200
--#define HUB_RESET_TIMEOUT 500
--
--#define DBGP_MAX_PACKET 8
--
--static int dbgp_wait_until_complete(void)
--{
-- u32 ctrl;
-- int loop = 0x100000;
--
-- do {
-- ctrl = readl(&ehci_debug->control);
-- /* Stop when the transaction is finished */
-- if (ctrl & DBGP_DONE)
-- break;
-- } while (--loop > 0);
--
-- if (!loop)
-- return -1;
--
-- /*
-- * Now that we have observed the completed transaction,
-- * clear the done bit.
-- */
-- writel(ctrl | DBGP_DONE, &ehci_debug->control);
-- return (ctrl & DBGP_ERROR) ? -DBGP_ERRCODE(ctrl) : DBGP_LEN(ctrl);
--}
--
--static void __init dbgp_mdelay(int ms)
--{
-- int i;
--
-- while (ms--) {
-- for (i = 0; i < 1000; i++)
-- outb(0x1, 0x80);
-- }
--}
--
--static void dbgp_breath(void)
--{
-- /* Sleep to give the debug port a chance to breathe */
--}
--
--static int dbgp_wait_until_done(unsigned ctrl)
--{
-- u32 pids, lpid;
-- int ret;
-- int loop = 3;
--
--retry:
-- writel(ctrl | DBGP_GO, &ehci_debug->control);
-- ret = dbgp_wait_until_complete();
-- pids = readl(&ehci_debug->pids);
-- lpid = DBGP_PID_GET(pids);
--
-- if (ret < 0)
-- return ret;
--
-- /*
-- * If the port is getting full or it has dropped data
-- * start pacing ourselves, not necessary but it's friendly.
-- */
-- if ((lpid == USB_PID_NAK) || (lpid == USB_PID_NYET))
-- dbgp_breath();
--
-- /* If I get a NACK reissue the transmission */
-- if (lpid == USB_PID_NAK) {
-- if (--loop > 0)
-- goto retry;
-- }
--
-- return ret;
--}
--
--static void dbgp_set_data(const void *buf, int size)
--{
-- const unsigned char *bytes = buf;
-- u32 lo, hi;
-- int i;
--
-- lo = hi = 0;
-- for (i = 0; i < 4 && i < size; i++)
-- lo |= bytes[i] << (8*i);
-- for (; i < 8 && i < size; i++)
-- hi |= bytes[i] << (8*(i - 4));
-- writel(lo, &ehci_debug->data03);
-- writel(hi, &ehci_debug->data47);
--}
--
--static void __init dbgp_get_data(void *buf, int size)
--{
-- unsigned char *bytes = buf;
-- u32 lo, hi;
-- int i;
--
-- lo = readl(&ehci_debug->data03);
-- hi = readl(&ehci_debug->data47);
-- for (i = 0; i < 4 && i < size; i++)
-- bytes[i] = (lo >> (8*i)) & 0xff;
-- for (; i < 8 && i < size; i++)
-- bytes[i] = (hi >> (8*(i - 4))) & 0xff;
--}
--
--static int dbgp_bulk_write(unsigned devnum, unsigned endpoint,
-- const char *bytes, int size)
--{
-- u32 pids, addr, ctrl;
-- int ret;
--
-- if (size > DBGP_MAX_PACKET)
-- return -1;
--
-- addr = DBGP_EPADDR(devnum, endpoint);
--
-- pids = readl(&ehci_debug->pids);
-- pids = dbgp_pid_update(pids, USB_PID_OUT);
--
-- ctrl = readl(&ehci_debug->control);
-- ctrl = dbgp_len_update(ctrl, size);
-- ctrl |= DBGP_OUT;
-- ctrl |= DBGP_GO;
--
-- dbgp_set_data(bytes, size);
-- writel(addr, &ehci_debug->address);
-- writel(pids, &ehci_debug->pids);
--
-- ret = dbgp_wait_until_done(ctrl);
-- if (ret < 0)
-- return ret;
--
-- return ret;
--}
--
--static int __init dbgp_bulk_read(unsigned devnum, unsigned endpoint, void *data,
-- int size)
--{
-- u32 pids, addr, ctrl;
-- int ret;
--
-- if (size > DBGP_MAX_PACKET)
-- return -1;
--
-- addr = DBGP_EPADDR(devnum, endpoint);
--
-- pids = readl(&ehci_debug->pids);
-- pids = dbgp_pid_update(pids, USB_PID_IN);
--
-- ctrl = readl(&ehci_debug->control);
-- ctrl = dbgp_len_update(ctrl, size);
-- ctrl &= ~DBGP_OUT;
-- ctrl |= DBGP_GO;
--
-- writel(addr, &ehci_debug->address);
-- writel(pids, &ehci_debug->pids);
-- ret = dbgp_wait_until_done(ctrl);
-- if (ret < 0)
-- return ret;
--
-- if (size > ret)
-- size = ret;
-- dbgp_get_data(data, size);
-- return ret;
--}
--
--static int __init dbgp_control_msg(unsigned devnum, int requesttype,
-- int request, int value, int index, void *data, int size)
--{
-- u32 pids, addr, ctrl;
-- struct usb_ctrlrequest req;
-- int read;
-- int ret;
--
-- read = (requesttype & USB_DIR_IN) != 0;
-- if (size > (read ? DBGP_MAX_PACKET:0))
-- return -1;
--
-- /* Compute the control message */
-- req.bRequestType = requesttype;
-- req.bRequest = request;
-- req.wValue = cpu_to_le16(value);
-- req.wIndex = cpu_to_le16(index);
-- req.wLength = cpu_to_le16(size);
--
-- pids = DBGP_PID_SET(USB_PID_DATA0, USB_PID_SETUP);
-- addr = DBGP_EPADDR(devnum, 0);
--
-- ctrl = readl(&ehci_debug->control);
-- ctrl = dbgp_len_update(ctrl, sizeof(req));
-- ctrl |= DBGP_OUT;
-- ctrl |= DBGP_GO;
--
-- /* Send the setup message */
-- dbgp_set_data(&req, sizeof(req));
-- writel(addr, &ehci_debug->address);
-- writel(pids, &ehci_debug->pids);
-- ret = dbgp_wait_until_done(ctrl);
-- if (ret < 0)
-- return ret;
--
-- /* Read the result */
-- return dbgp_bulk_read(devnum, 0, data, size);
--}
--
--
--/* Find a PCI capability */
--static u32 __init find_cap(u32 num, u32 slot, u32 func, int cap)
--{
-- u8 pos;
-- int bytes;
--
-- if (!(read_pci_config_16(num, slot, func, PCI_STATUS) &
-- PCI_STATUS_CAP_LIST))
-- return 0;
--
-- pos = read_pci_config_byte(num, slot, func, PCI_CAPABILITY_LIST);
-- for (bytes = 0; bytes < 48 && pos >= 0x40; bytes++) {
-- u8 id;
--
-- pos &= ~3;
-- id = read_pci_config_byte(num, slot, func, pos+PCI_CAP_LIST_ID);
-- if (id == 0xff)
-- break;
-- if (id == cap)
-- return pos;
--
-- pos = read_pci_config_byte(num, slot, func,
-- pos+PCI_CAP_LIST_NEXT);
-- }
-- return 0;
--}
--
--static u32 __init __find_dbgp(u32 bus, u32 slot, u32 func)
--{
-- u32 class;
--
-- class = read_pci_config(bus, slot, func, PCI_CLASS_REVISION);
-- if ((class >> 8) != PCI_CLASS_SERIAL_USB_EHCI)
-- return 0;
--
-- return find_cap(bus, slot, func, PCI_CAP_ID_EHCI_DEBUG);
--}
--
--static u32 __init find_dbgp(int ehci_num, u32 *rbus, u32 *rslot, u32 *rfunc)
--{
-- u32 bus, slot, func;
--
-- for (bus = 0; bus < 256; bus++) {
-- for (slot = 0; slot < 32; slot++) {
-- for (func = 0; func < 8; func++) {
-- unsigned cap;
--
-- cap = __find_dbgp(bus, slot, func);
--
-- if (!cap)
-- continue;
-- if (ehci_num-- != 0)
-- continue;
-- *rbus = bus;
-- *rslot = slot;
-- *rfunc = func;
-- return cap;
-- }
-- }
-- }
-- return 0;
--}
--
--static int __init ehci_reset_port(int port)
--{
-- u32 portsc;
-- u32 delay_time, delay;
-- int loop;
--
-- /* Reset the usb debug port */
-- portsc = readl(&ehci_regs->port_status[port - 1]);
-- portsc &= ~PORT_PE;
-- portsc |= PORT_RESET;
-- writel(portsc, &ehci_regs->port_status[port - 1]);
--
-- delay = HUB_ROOT_RESET_TIME;
-- for (delay_time = 0; delay_time < HUB_RESET_TIMEOUT;
-- delay_time += delay) {
-- dbgp_mdelay(delay);
--
-- portsc = readl(&ehci_regs->port_status[port - 1]);
-- if (portsc & PORT_RESET) {
-- /* force reset to complete */
-- loop = 2;
-- writel(portsc & ~(PORT_RWC_BITS | PORT_RESET),
-- &ehci_regs->port_status[port - 1]);
-- do {
-- portsc = readl(&ehci_regs->port_status[port-1]);
-- } while ((portsc & PORT_RESET) && (--loop > 0));
-- }
--
-- /* Device went away? */
-- if (!(portsc & PORT_CONNECT))
-- return -ENOTCONN;
--
-- /* bomb out completely if something weird happend */
-- if ((portsc & PORT_CSC))
-- return -EINVAL;
--
-- /* If we've finished resetting, then break out of the loop */
-- if (!(portsc & PORT_RESET) && (portsc & PORT_PE))
-- return 0;
-- }
-- return -EBUSY;
--}
--
--static int __init ehci_wait_for_port(int port)
--{
-- u32 status;
-- int ret, reps;
--
-- for (reps = 0; reps < 3; reps++) {
-- dbgp_mdelay(100);
-- status = readl(&ehci_regs->status);
-- if (status & STS_PCD) {
-- ret = ehci_reset_port(port);
-- if (ret == 0)
-- return 0;
-- }
-- }
-- return -ENOTCONN;
--}
--
--#ifdef DBGP_DEBUG
--# define dbgp_printk early_printk
--#else
--static inline void dbgp_printk(const char *fmt, ...) { }
--#endif
--
--typedef void (*set_debug_port_t)(int port);
--
--static void __init default_set_debug_port(int port)
--{
--}
--
--static set_debug_port_t __initdata set_debug_port = default_set_debug_port;
--
--static void __init nvidia_set_debug_port(int port)
--{
-- u32 dword;
-- dword = read_pci_config(ehci_dev.bus, ehci_dev.slot, ehci_dev.func,
-- 0x74);
-- dword &= ~(0x0f<<12);
-- dword |= ((port & 0x0f)<<12);
-- write_pci_config(ehci_dev.bus, ehci_dev.slot, ehci_dev.func, 0x74,
-- dword);
-- dbgp_printk("set debug port to %d\n", port);
--}
--
--static void __init detect_set_debug_port(void)
--{
-- u32 vendorid;
--
-- vendorid = read_pci_config(ehci_dev.bus, ehci_dev.slot, ehci_dev.func,
-- 0x00);
--
-- if ((vendorid & 0xffff) == 0x10de) {
-- dbgp_printk("using nvidia set_debug_port\n");
-- set_debug_port = nvidia_set_debug_port;
-- }
--}
--
--static int __init ehci_setup(void)
--{
-- struct usb_debug_descriptor dbgp_desc;
-- u32 cmd, ctrl, status, portsc, hcs_params;
-- u32 debug_port, new_debug_port = 0, n_ports;
-- u32 devnum;
-- int ret, i;
-- int loop;
-- int port_map_tried;
-- int playtimes = 3;
--
--try_next_time:
-- port_map_tried = 0;
--
--try_next_port:
--
-- hcs_params = readl(&ehci_caps->hcs_params);
-- debug_port = HCS_DEBUG_PORT(hcs_params);
-- n_ports = HCS_N_PORTS(hcs_params);
--
-- dbgp_printk("debug_port: %d\n", debug_port);
-- dbgp_printk("n_ports: %d\n", n_ports);
--
-- for (i = 1; i <= n_ports; i++) {
-- portsc = readl(&ehci_regs->port_status[i-1]);
-- dbgp_printk("portstatus%d: %08x\n", i, portsc);
-- }
--
-- if (port_map_tried && (new_debug_port != debug_port)) {
-- if (--playtimes) {
-- set_debug_port(new_debug_port);
-- goto try_next_time;
-- }
-- return -1;
-- }
--
-- loop = 10;
-- /* Reset the EHCI controller */
-- cmd = readl(&ehci_regs->command);
-- cmd |= CMD_RESET;
-- writel(cmd, &ehci_regs->command);
-- do {
-- cmd = readl(&ehci_regs->command);
-- } while ((cmd & CMD_RESET) && (--loop > 0));
--
-- if (!loop) {
-- dbgp_printk("can not reset ehci\n");
-- return -1;
-- }
-- dbgp_printk("ehci reset done\n");
--
-- /* Claim ownership, but do not enable yet */
-- ctrl = readl(&ehci_debug->control);
-- ctrl |= DBGP_OWNER;
-- ctrl &= ~(DBGP_ENABLED | DBGP_INUSE);
-- writel(ctrl, &ehci_debug->control);
--
-- /* Start the ehci running */
-- cmd = readl(&ehci_regs->command);
-- cmd &= ~(CMD_LRESET | CMD_IAAD | CMD_PSE | CMD_ASE | CMD_RESET);
-- cmd |= CMD_RUN;
-- writel(cmd, &ehci_regs->command);
--
-- /* Ensure everything is routed to the EHCI */
-- writel(FLAG_CF, &ehci_regs->configured_flag);
--
-- /* Wait until the controller is no longer halted */
-- loop = 10;
-- do {
-- status = readl(&ehci_regs->status);
-- } while ((status & STS_HALT) && (--loop > 0));
--
-- if (!loop) {
-- dbgp_printk("ehci can be started\n");
-- return -1;
-- }
-- dbgp_printk("ehci started\n");
--
-- /* Wait for a device to show up in the debug port */
-- ret = ehci_wait_for_port(debug_port);
-- if (ret < 0) {
-- dbgp_printk("No device found in debug port\n");
-- goto next_debug_port;
-- }
-- dbgp_printk("ehci wait for port done\n");
--
-- /* Enable the debug port */
-- ctrl = readl(&ehci_debug->control);
-- ctrl |= DBGP_CLAIM;
-- writel(ctrl, &ehci_debug->control);
-- ctrl = readl(&ehci_debug->control);
-- if ((ctrl & DBGP_CLAIM) != DBGP_CLAIM) {
-- dbgp_printk("No device in debug port\n");
-- writel(ctrl & ~DBGP_CLAIM, &ehci_debug->control);
-- goto err;
-- }
-- dbgp_printk("debug ported enabled\n");
--
-- /* Completely transfer the debug device to the debug controller */
-- portsc = readl(&ehci_regs->port_status[debug_port - 1]);
-- portsc &= ~PORT_PE;
-- writel(portsc, &ehci_regs->port_status[debug_port - 1]);
--
-- dbgp_mdelay(100);
--
-- /* Find the debug device and make it device number 127 */
-- for (devnum = 0; devnum <= 127; devnum++) {
-- ret = dbgp_control_msg(devnum,
-- USB_DIR_IN | USB_TYPE_STANDARD | USB_RECIP_DEVICE,
-- USB_REQ_GET_DESCRIPTOR, (USB_DT_DEBUG << 8), 0,
-- &dbgp_desc, sizeof(dbgp_desc));
-- if (ret > 0)
-- break;
-- }
-- if (devnum > 127) {
-- dbgp_printk("Could not find attached debug device\n");
-- goto err;
-- }
-- if (ret < 0) {
-- dbgp_printk("Attached device is not a debug device\n");
-- goto err;
-- }
-- dbgp_endpoint_out = dbgp_desc.bDebugOutEndpoint;
--
-- /* Move the device to 127 if it isn't already there */
-- if (devnum != USB_DEBUG_DEVNUM) {
-- ret = dbgp_control_msg(devnum,
-- USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE,
-- USB_REQ_SET_ADDRESS, USB_DEBUG_DEVNUM, 0, NULL, 0);
-- if (ret < 0) {
-- dbgp_printk("Could not move attached device to %d\n",
-- USB_DEBUG_DEVNUM);
-- goto err;
-- }
-- devnum = USB_DEBUG_DEVNUM;
-- dbgp_printk("debug device renamed to 127\n");
-- }
--
-- /* Enable the debug interface */
-- ret = dbgp_control_msg(USB_DEBUG_DEVNUM,
-- USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE,
-- USB_REQ_SET_FEATURE, USB_DEVICE_DEBUG_MODE, 0, NULL, 0);
-- if (ret < 0) {
-- dbgp_printk(" Could not enable the debug device\n");
-- goto err;
-- }
-- dbgp_printk("debug interface enabled\n");
--
-- /* Perform a small write to get the even/odd data state in sync
-- */
-- ret = dbgp_bulk_write(USB_DEBUG_DEVNUM, dbgp_endpoint_out, " ", 1);
-- if (ret < 0) {
-- dbgp_printk("dbgp_bulk_write failed: %d\n", ret);
-- goto err;
-- }
-- dbgp_printk("small write doned\n");
--
-- return 0;
--err:
-- /* Things didn't work so remove my claim */
-- ctrl = readl(&ehci_debug->control);
-- ctrl &= ~(DBGP_CLAIM | DBGP_OUT);
-- writel(ctrl, &ehci_debug->control);
-- return -1;
--
--next_debug_port:
-- port_map_tried |= (1<<(debug_port - 1));
-- new_debug_port = ((debug_port-1+1)%n_ports) + 1;
-- if (port_map_tried != ((1<<n_ports) - 1)) {
-- set_debug_port(new_debug_port);
-- goto try_next_port;
-- }
-- if (--playtimes) {
-- set_debug_port(new_debug_port);
-- goto try_next_time;
-- }
--
-- return -1;
--}
--
--static int __init early_dbgp_init(char *s)
--{
-- u32 debug_port, bar, offset;
-- u32 bus, slot, func, cap;
-- void __iomem *ehci_bar;
-- u32 dbgp_num;
-- u32 bar_val;
-- char *e;
-- int ret;
-- u8 byte;
--
-- if (!early_pci_allowed())
-- return -1;
--
-- dbgp_num = 0;
-- if (*s)
-- dbgp_num = simple_strtoul(s, &e, 10);
-- dbgp_printk("dbgp_num: %d\n", dbgp_num);
--
-- cap = find_dbgp(dbgp_num, &bus, &slot, &func);
-- if (!cap)
-- return -1;
--
-- dbgp_printk("Found EHCI debug port on %02x:%02x.%1x\n", bus, slot,
-- func);
--
-- debug_port = read_pci_config(bus, slot, func, cap);
-- bar = (debug_port >> 29) & 0x7;
-- bar = (bar * 4) + 0xc;
-- offset = (debug_port >> 16) & 0xfff;
-- dbgp_printk("bar: %02x offset: %03x\n", bar, offset);
-- if (bar != PCI_BASE_ADDRESS_0) {
-- dbgp_printk("only debug ports on bar 1 handled.\n");
--
-- return -1;
-- }
--
-- bar_val = read_pci_config(bus, slot, func, PCI_BASE_ADDRESS_0);
-- dbgp_printk("bar_val: %02x offset: %03x\n", bar_val, offset);
-- if (bar_val & ~PCI_BASE_ADDRESS_MEM_MASK) {
-- dbgp_printk("only simple 32bit mmio bars supported\n");
--
-- return -1;
-- }
--
-- /* double check if the mem space is enabled */
-- byte = read_pci_config_byte(bus, slot, func, 0x04);
-- if (!(byte & 0x2)) {
-- byte |= 0x02;
-- write_pci_config_byte(bus, slot, func, 0x04, byte);
-- dbgp_printk("mmio for ehci enabled\n");
-- }
--
-- /*
-- * FIXME I don't have the bar size so just guess PAGE_SIZE is more
-- * than enough. 1K is the biggest I have seen.
-- */
-- set_fixmap_nocache(FIX_DBGP_BASE, bar_val & PAGE_MASK);
-- ehci_bar = (void __iomem *)__fix_to_virt(FIX_DBGP_BASE);
-- ehci_bar += bar_val & ~PAGE_MASK;
-- dbgp_printk("ehci_bar: %p\n", ehci_bar);
--
-- ehci_caps = ehci_bar;
-- ehci_regs = ehci_bar + HC_LENGTH(readl(&ehci_caps->hc_capbase));
-- ehci_debug = ehci_bar + offset;
-- ehci_dev.bus = bus;
-- ehci_dev.slot = slot;
-- ehci_dev.func = func;
--
-- detect_set_debug_port();
--
-- ret = ehci_setup();
-- if (ret < 0) {
-- dbgp_printk("ehci_setup failed\n");
-- ehci_debug = NULL;
--
-- return -1;
-- }
--
-- return 0;
--}
--
--static void early_dbgp_write(struct console *con, const char *str, u32 n)
--{
-- int chunk, ret;
--
-- if (!ehci_debug)
-- return;
-- while (n > 0) {
-- chunk = n;
-- if (chunk > DBGP_MAX_PACKET)
-- chunk = DBGP_MAX_PACKET;
-- ret = dbgp_bulk_write(USB_DEBUG_DEVNUM,
-- dbgp_endpoint_out, str, chunk);
-- str += chunk;
-- n -= chunk;
-- }
--}
--
--static struct console early_dbgp_console = {
-- .name = "earlydbg",
-- .write = early_dbgp_write,
-- .flags = CON_PRINTBUFFER,
-- .index = -1,
--};
--#endif
--
- /* Direct interface for emergencies */
- static struct console *early_console = &early_vga_console;
- static int __initdata early_console_initialized;
---- /dev/null
-+++ b/drivers/usb/early/ehci-dbgp.c
-@@ -0,0 +1,723 @@
-+#include <linux/console.h>
-+#include <linux/errno.h>
-+#include <linux/pci_regs.h>
-+#include <linux/pci_ids.h>
-+#include <linux/usb/ch9.h>
-+#include <linux/usb/ehci_def.h>
-+#include <linux/delay.h>
-+#include <asm/io.h>
-+#include <asm/pci-direct.h>
-+#include <asm/fixmap.h>
-+
-+static struct ehci_caps __iomem *ehci_caps;
-+static struct ehci_regs __iomem *ehci_regs;
-+static struct ehci_dbg_port __iomem *ehci_debug;
-+static unsigned int dbgp_endpoint_out;
-+
-+struct ehci_dev {
-+ u32 bus;
-+ u32 slot;
-+ u32 func;
-+};
-+
-+static struct ehci_dev ehci_dev;
-+
-+#define USB_DEBUG_DEVNUM 127
-+
-+#define DBGP_DATA_TOGGLE 0x8800
-+
-+static inline u32 dbgp_pid_update(u32 x, u32 tok)
-+{
-+ return ((x ^ DBGP_DATA_TOGGLE) & 0xffff00) | (tok & 0xff);
-+}
-+
-+static inline u32 dbgp_len_update(u32 x, u32 len)
-+{
-+ return (x & ~0x0f) | (len & 0x0f);
-+}
-+
-+/*
-+ * USB Packet IDs (PIDs)
-+ */
-+
-+/* token */
-+#define USB_PID_OUT 0xe1
-+#define USB_PID_IN 0x69
-+#define USB_PID_SOF 0xa5
-+#define USB_PID_SETUP 0x2d
-+/* handshake */
-+#define USB_PID_ACK 0xd2
-+#define USB_PID_NAK 0x5a
-+#define USB_PID_STALL 0x1e
-+#define USB_PID_NYET 0x96
-+/* data */
-+#define USB_PID_DATA0 0xc3
-+#define USB_PID_DATA1 0x4b
-+#define USB_PID_DATA2 0x87
-+#define USB_PID_MDATA 0x0f
-+/* Special */
-+#define USB_PID_PREAMBLE 0x3c
-+#define USB_PID_ERR 0x3c
-+#define USB_PID_SPLIT 0x78
-+#define USB_PID_PING 0xb4
-+#define USB_PID_UNDEF_0 0xf0
-+
-+#define USB_PID_DATA_TOGGLE 0x88
-+#define DBGP_CLAIM (DBGP_OWNER | DBGP_ENABLED | DBGP_INUSE)
-+
-+#define PCI_CAP_ID_EHCI_DEBUG 0xa
-+
-+#define HUB_ROOT_RESET_TIME 50 /* times are in msec */
-+#define HUB_SHORT_RESET_TIME 10
-+#define HUB_LONG_RESET_TIME 200
-+#define HUB_RESET_TIMEOUT 500
-+
-+#define DBGP_MAX_PACKET 8
-+
-+static int dbgp_wait_until_complete(void)
-+{
-+ u32 ctrl;
-+ int loop = 0x100000;
-+
-+ do {
-+ ctrl = readl(&ehci_debug->control);
-+ /* Stop when the transaction is finished */
-+ if (ctrl & DBGP_DONE)
-+ break;
-+ } while (--loop > 0);
-+
-+ if (!loop)
-+ return -1;
-+
-+ /*
-+ * Now that we have observed the completed transaction,
-+ * clear the done bit.
-+ */
-+ writel(ctrl | DBGP_DONE, &ehci_debug->control);
-+ return (ctrl & DBGP_ERROR) ? -DBGP_ERRCODE(ctrl) : DBGP_LEN(ctrl);
-+}
-+
-+static void __init dbgp_mdelay(int ms)
-+{
-+ int i;
-+
-+ while (ms--) {
-+ for (i = 0; i < 1000; i++)
-+ outb(0x1, 0x80);
-+ }
-+}
-+
-+static void dbgp_breath(void)
-+{
-+ /* Sleep to give the debug port a chance to breathe */
-+}
-+
-+static int dbgp_wait_until_done(unsigned ctrl)
-+{
-+ u32 pids, lpid;
-+ int ret;
-+ int loop = 3;
-+
-+retry:
-+ writel(ctrl | DBGP_GO, &ehci_debug->control);
-+ ret = dbgp_wait_until_complete();
-+ pids = readl(&ehci_debug->pids);
-+ lpid = DBGP_PID_GET(pids);
-+
-+ if (ret < 0)
-+ return ret;
-+
-+ /*
-+ * If the port is getting full or it has dropped data
-+ * start pacing ourselves, not necessary but it's friendly.
-+ */
-+ if ((lpid == USB_PID_NAK) || (lpid == USB_PID_NYET))
-+ dbgp_breath();
-+
-+ /* If I get a NACK reissue the transmission */
-+ if (lpid == USB_PID_NAK) {
-+ if (--loop > 0)
-+ goto retry;
-+ }
-+
-+ return ret;
-+}
-+
-+static void dbgp_set_data(const void *buf, int size)
-+{
-+ const unsigned char *bytes = buf;
-+ u32 lo, hi;
-+ int i;
-+
-+ lo = hi = 0;
-+ for (i = 0; i < 4 && i < size; i++)
-+ lo |= bytes[i] << (8*i);
-+ for (; i < 8 && i < size; i++)
-+ hi |= bytes[i] << (8*(i - 4));
-+ writel(lo, &ehci_debug->data03);
-+ writel(hi, &ehci_debug->data47);
-+}
-+
-+static void __init dbgp_get_data(void *buf, int size)
-+{
-+ unsigned char *bytes = buf;
-+ u32 lo, hi;
-+ int i;
-+
-+ lo = readl(&ehci_debug->data03);
-+ hi = readl(&ehci_debug->data47);
-+ for (i = 0; i < 4 && i < size; i++)
-+ bytes[i] = (lo >> (8*i)) & 0xff;
-+ for (; i < 8 && i < size; i++)
-+ bytes[i] = (hi >> (8*(i - 4))) & 0xff;
-+}
-+
-+static int dbgp_bulk_write(unsigned devnum, unsigned endpoint,
-+ const char *bytes, int size)
-+{
-+ u32 pids, addr, ctrl;
-+ int ret;
-+
-+ if (size > DBGP_MAX_PACKET)
-+ return -1;
-+
-+ addr = DBGP_EPADDR(devnum, endpoint);
-+
-+ pids = readl(&ehci_debug->pids);
-+ pids = dbgp_pid_update(pids, USB_PID_OUT);
-+
-+ ctrl = readl(&ehci_debug->control);
-+ ctrl = dbgp_len_update(ctrl, size);
-+ ctrl |= DBGP_OUT;
-+ ctrl |= DBGP_GO;
-+
-+ dbgp_set_data(bytes, size);
-+ writel(addr, &ehci_debug->address);
-+ writel(pids, &ehci_debug->pids);
-+
-+ ret = dbgp_wait_until_done(ctrl);
-+ if (ret < 0)
-+ return ret;
-+
-+ return ret;
-+}
-+
-+static int __init dbgp_bulk_read(unsigned devnum, unsigned endpoint, void *data,
-+ int size)
-+{
-+ u32 pids, addr, ctrl;
-+ int ret;
-+
-+ if (size > DBGP_MAX_PACKET)
-+ return -1;
-+
-+ addr = DBGP_EPADDR(devnum, endpoint);
-+
-+ pids = readl(&ehci_debug->pids);
-+ pids = dbgp_pid_update(pids, USB_PID_IN);
-+
-+ ctrl = readl(&ehci_debug->control);
-+ ctrl = dbgp_len_update(ctrl, size);
-+ ctrl &= ~DBGP_OUT;
-+ ctrl |= DBGP_GO;
-+
-+ writel(addr, &ehci_debug->address);
-+ writel(pids, &ehci_debug->pids);
-+ ret = dbgp_wait_until_done(ctrl);
-+ if (ret < 0)
-+ return ret;
-+
-+ if (size > ret)
-+ size = ret;
-+ dbgp_get_data(data, size);
-+ return ret;
-+}
-+
-+static int __init dbgp_control_msg(unsigned devnum, int requesttype,
-+ int request, int value, int index, void *data, int size)
-+{
-+ u32 pids, addr, ctrl;
-+ struct usb_ctrlrequest req;
-+ int read;
-+ int ret;
-+
-+ read = (requesttype & USB_DIR_IN) != 0;
-+ if (size > (read ? DBGP_MAX_PACKET:0))
-+ return -1;
-+
-+ /* Compute the control message */
-+ req.bRequestType = requesttype;
-+ req.bRequest = request;
-+ req.wValue = cpu_to_le16(value);
-+ req.wIndex = cpu_to_le16(index);
-+ req.wLength = cpu_to_le16(size);
-+
-+ pids = DBGP_PID_SET(USB_PID_DATA0, USB_PID_SETUP);
-+ addr = DBGP_EPADDR(devnum, 0);
-+
-+ ctrl = readl(&ehci_debug->control);
-+ ctrl = dbgp_len_update(ctrl, sizeof(req));
-+ ctrl |= DBGP_OUT;
-+ ctrl |= DBGP_GO;
-+
-+ /* Send the setup message */
-+ dbgp_set_data(&req, sizeof(req));
-+ writel(addr, &ehci_debug->address);
-+ writel(pids, &ehci_debug->pids);
-+ ret = dbgp_wait_until_done(ctrl);
-+ if (ret < 0)
-+ return ret;
-+
-+ /* Read the result */
-+ return dbgp_bulk_read(devnum, 0, data, size);
-+}
-+
-+
-+/* Find a PCI capability */
-+static u32 __init find_cap(u32 num, u32 slot, u32 func, int cap)
-+{
-+ u8 pos;
-+ int bytes;
-+
-+ if (!(read_pci_config_16(num, slot, func, PCI_STATUS) &
-+ PCI_STATUS_CAP_LIST))
-+ return 0;
-+
-+ pos = read_pci_config_byte(num, slot, func, PCI_CAPABILITY_LIST);
-+ for (bytes = 0; bytes < 48 && pos >= 0x40; bytes++) {
-+ u8 id;
-+
-+ pos &= ~3;
-+ id = read_pci_config_byte(num, slot, func, pos+PCI_CAP_LIST_ID);
-+ if (id == 0xff)
-+ break;
-+ if (id == cap)
-+ return pos;
-+
-+ pos = read_pci_config_byte(num, slot, func,
-+ pos+PCI_CAP_LIST_NEXT);
-+ }
-+ return 0;
-+}
-+
-+static u32 __init __find_dbgp(u32 bus, u32 slot, u32 func)
-+{
-+ u32 class;
-+
-+ class = read_pci_config(bus, slot, func, PCI_CLASS_REVISION);
-+ if ((class >> 8) != PCI_CLASS_SERIAL_USB_EHCI)
-+ return 0;
-+
-+ return find_cap(bus, slot, func, PCI_CAP_ID_EHCI_DEBUG);
-+}
-+
-+static u32 __init find_dbgp(int ehci_num, u32 *rbus, u32 *rslot, u32 *rfunc)
-+{
-+ u32 bus, slot, func;
-+
-+ for (bus = 0; bus < 256; bus++) {
-+ for (slot = 0; slot < 32; slot++) {
-+ for (func = 0; func < 8; func++) {
-+ unsigned cap;
-+
-+ cap = __find_dbgp(bus, slot, func);
-+
-+ if (!cap)
-+ continue;
-+ if (ehci_num-- != 0)
-+ continue;
-+ *rbus = bus;
-+ *rslot = slot;
-+ *rfunc = func;
-+ return cap;
-+ }
-+ }
-+ }
-+ return 0;
-+}
-+
-+static int __init ehci_reset_port(int port)
-+{
-+ u32 portsc;
-+ u32 delay_time, delay;
-+ int loop;
-+
-+ /* Reset the usb debug port */
-+ portsc = readl(&ehci_regs->port_status[port - 1]);
-+ portsc &= ~PORT_PE;
-+ portsc |= PORT_RESET;
-+ writel(portsc, &ehci_regs->port_status[port - 1]);
-+
-+ delay = HUB_ROOT_RESET_TIME;
-+ for (delay_time = 0; delay_time < HUB_RESET_TIMEOUT;
-+ delay_time += delay) {
-+ dbgp_mdelay(delay);
-+
-+ portsc = readl(&ehci_regs->port_status[port - 1]);
-+ if (portsc & PORT_RESET) {
-+ /* force reset to complete */
-+ loop = 2;
-+ writel(portsc & ~(PORT_RWC_BITS | PORT_RESET),
-+ &ehci_regs->port_status[port - 1]);
-+ do {
-+ portsc = readl(&ehci_regs->port_status[port-1]);
-+ } while ((portsc & PORT_RESET) && (--loop > 0));
-+ }
-+
-+ /* Device went away? */
-+ if (!(portsc & PORT_CONNECT))
-+ return -ENOTCONN;
-+
-+ /* bomb out completely if something weird happend */
-+ if ((portsc & PORT_CSC))
-+ return -EINVAL;
-+
-+ /* If we've finished resetting, then break out of the loop */
-+ if (!(portsc & PORT_RESET) && (portsc & PORT_PE))
-+ return 0;
-+ }
-+ return -EBUSY;
-+}
-+
-+static int __init ehci_wait_for_port(int port)
-+{
-+ u32 status;
-+ int ret, reps;
-+
-+ for (reps = 0; reps < 3; reps++) {
-+ dbgp_mdelay(100);
-+ status = readl(&ehci_regs->status);
-+ if (status & STS_PCD) {
-+ ret = ehci_reset_port(port);
-+ if (ret == 0)
-+ return 0;
-+ }
-+ }
-+ return -ENOTCONN;
-+}
-+
-+#ifdef DBGP_DEBUG
-+# define dbgp_printk early_printk
-+#else
-+static inline void dbgp_printk(const char *fmt, ...) { }
-+#endif
-+
-+typedef void (*set_debug_port_t)(int port);
-+
-+static void __init default_set_debug_port(int port)
-+{
-+}
-+
-+static set_debug_port_t __initdata set_debug_port = default_set_debug_port;
-+
-+static void __init nvidia_set_debug_port(int port)
-+{
-+ u32 dword;
-+ dword = read_pci_config(ehci_dev.bus, ehci_dev.slot, ehci_dev.func,
-+ 0x74);
-+ dword &= ~(0x0f<<12);
-+ dword |= ((port & 0x0f)<<12);
-+ write_pci_config(ehci_dev.bus, ehci_dev.slot, ehci_dev.func, 0x74,
-+ dword);
-+ dbgp_printk("set debug port to %d\n", port);
-+}
-+
-+static void __init detect_set_debug_port(void)
-+{
-+ u32 vendorid;
-+
-+ vendorid = read_pci_config(ehci_dev.bus, ehci_dev.slot, ehci_dev.func,
-+ 0x00);
-+
-+ if ((vendorid & 0xffff) == 0x10de) {
-+ dbgp_printk("using nvidia set_debug_port\n");
-+ set_debug_port = nvidia_set_debug_port;
-+ }
-+}
-+
-+static int __init ehci_setup(void)
-+{
-+ struct usb_debug_descriptor dbgp_desc;
-+ u32 cmd, ctrl, status, portsc, hcs_params;
-+ u32 debug_port, new_debug_port = 0, n_ports;
-+ u32 devnum;
-+ int ret, i;
-+ int loop;
-+ int port_map_tried;
-+ int playtimes = 3;
-+
-+try_next_time:
-+ port_map_tried = 0;
-+
-+try_next_port:
-+
-+ hcs_params = readl(&ehci_caps->hcs_params);
-+ debug_port = HCS_DEBUG_PORT(hcs_params);
-+ n_ports = HCS_N_PORTS(hcs_params);
-+
-+ dbgp_printk("debug_port: %d\n", debug_port);
-+ dbgp_printk("n_ports: %d\n", n_ports);
-+
-+ for (i = 1; i <= n_ports; i++) {
-+ portsc = readl(&ehci_regs->port_status[i-1]);
-+ dbgp_printk("portstatus%d: %08x\n", i, portsc);
-+ }
-+
-+ if (port_map_tried && (new_debug_port != debug_port)) {
-+ if (--playtimes) {
-+ set_debug_port(new_debug_port);
-+ goto try_next_time;
-+ }
-+ return -1;
-+ }
-+
-+ loop = 10;
-+ /* Reset the EHCI controller */
-+ cmd = readl(&ehci_regs->command);
-+ cmd |= CMD_RESET;
-+ writel(cmd, &ehci_regs->command);
-+ do {
-+ cmd = readl(&ehci_regs->command);
-+ } while ((cmd & CMD_RESET) && (--loop > 0));
-+
-+ if (!loop) {
-+ dbgp_printk("can not reset ehci\n");
-+ return -1;
-+ }
-+ dbgp_printk("ehci reset done\n");
-+
-+ /* Claim ownership, but do not enable yet */
-+ ctrl = readl(&ehci_debug->control);
-+ ctrl |= DBGP_OWNER;
-+ ctrl &= ~(DBGP_ENABLED | DBGP_INUSE);
-+ writel(ctrl, &ehci_debug->control);
-+
-+ /* Start the ehci running */
-+ cmd = readl(&ehci_regs->command);
-+ cmd &= ~(CMD_LRESET | CMD_IAAD | CMD_PSE | CMD_ASE | CMD_RESET);
-+ cmd |= CMD_RUN;
-+ writel(cmd, &ehci_regs->command);
-+
-+ /* Ensure everything is routed to the EHCI */
-+ writel(FLAG_CF, &ehci_regs->configured_flag);
-+
-+ /* Wait until the controller is no longer halted */
-+ loop = 10;
-+ do {
-+ status = readl(&ehci_regs->status);
-+ } while ((status & STS_HALT) && (--loop > 0));
-+
-+ if (!loop) {
-+ dbgp_printk("ehci can be started\n");
-+ return -1;
-+ }
-+ dbgp_printk("ehci started\n");
-+
-+ /* Wait for a device to show up in the debug port */
-+ ret = ehci_wait_for_port(debug_port);
-+ if (ret < 0) {
-+ dbgp_printk("No device found in debug port\n");
-+ goto next_debug_port;
-+ }
-+ dbgp_printk("ehci wait for port done\n");
-+
-+ /* Enable the debug port */
-+ ctrl = readl(&ehci_debug->control);
-+ ctrl |= DBGP_CLAIM;
-+ writel(ctrl, &ehci_debug->control);
-+ ctrl = readl(&ehci_debug->control);
-+ if ((ctrl & DBGP_CLAIM) != DBGP_CLAIM) {
-+ dbgp_printk("No device in debug port\n");
-+ writel(ctrl & ~DBGP_CLAIM, &ehci_debug->control);
-+ goto err;
-+ }
-+ dbgp_printk("debug ported enabled\n");
-+
-+ /* Completely transfer the debug device to the debug controller */
-+ portsc = readl(&ehci_regs->port_status[debug_port - 1]);
-+ portsc &= ~PORT_PE;
-+ writel(portsc, &ehci_regs->port_status[debug_port - 1]);
-+
-+ dbgp_mdelay(100);
-+
-+ /* Find the debug device and make it device number 127 */
-+ for (devnum = 0; devnum <= 127; devnum++) {
-+ ret = dbgp_control_msg(devnum,
-+ USB_DIR_IN | USB_TYPE_STANDARD | USB_RECIP_DEVICE,
-+ USB_REQ_GET_DESCRIPTOR, (USB_DT_DEBUG << 8), 0,
-+ &dbgp_desc, sizeof(dbgp_desc));
-+ if (ret > 0)
-+ break;
-+ }
-+ if (devnum > 127) {
-+ dbgp_printk("Could not find attached debug device\n");
-+ goto err;
-+ }
-+ if (ret < 0) {
-+ dbgp_printk("Attached device is not a debug device\n");
-+ goto err;
-+ }
-+ dbgp_endpoint_out = dbgp_desc.bDebugOutEndpoint;
-+
-+ /* Move the device to 127 if it isn't already there */
-+ if (devnum != USB_DEBUG_DEVNUM) {
-+ ret = dbgp_control_msg(devnum,
-+ USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE,
-+ USB_REQ_SET_ADDRESS, USB_DEBUG_DEVNUM, 0, NULL, 0);
-+ if (ret < 0) {
-+ dbgp_printk("Could not move attached device to %d\n",
-+ USB_DEBUG_DEVNUM);
-+ goto err;
-+ }
-+ devnum = USB_DEBUG_DEVNUM;
-+ dbgp_printk("debug device renamed to 127\n");
-+ }
-+
-+ /* Enable the debug interface */
-+ ret = dbgp_control_msg(USB_DEBUG_DEVNUM,
-+ USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE,
-+ USB_REQ_SET_FEATURE, USB_DEVICE_DEBUG_MODE, 0, NULL, 0);
-+ if (ret < 0) {
-+ dbgp_printk(" Could not enable the debug device\n");
-+ goto err;
-+ }
-+ dbgp_printk("debug interface enabled\n");
-+
-+ /* Perform a small write to get the even/odd data state in sync
-+ */
-+ ret = dbgp_bulk_write(USB_DEBUG_DEVNUM, dbgp_endpoint_out, " ", 1);
-+ if (ret < 0) {
-+ dbgp_printk("dbgp_bulk_write failed: %d\n", ret);
-+ goto err;
-+ }
-+ dbgp_printk("small write doned\n");
-+
-+ return 0;
-+err:
-+ /* Things didn't work so remove my claim */
-+ ctrl = readl(&ehci_debug->control);
-+ ctrl &= ~(DBGP_CLAIM | DBGP_OUT);
-+ writel(ctrl, &ehci_debug->control);
-+ return -1;
-+
-+next_debug_port:
-+ port_map_tried |= (1<<(debug_port - 1));
-+ new_debug_port = ((debug_port-1+1)%n_ports) + 1;
-+ if (port_map_tried != ((1<<n_ports) - 1)) {
-+ set_debug_port(new_debug_port);
-+ goto try_next_port;
-+ }
-+ if (--playtimes) {
-+ set_debug_port(new_debug_port);
-+ goto try_next_time;
-+ }
-+
-+ return -1;
-+}
-+
-+int __init early_dbgp_init(char *s)
-+{
-+ u32 debug_port, bar, offset;
-+ u32 bus, slot, func, cap;
-+ void __iomem *ehci_bar;
-+ u32 dbgp_num;
-+ u32 bar_val;
-+ char *e;
-+ int ret;
-+ u8 byte;
-+
-+ if (!early_pci_allowed())
-+ return -1;
-+
-+ dbgp_num = 0;
-+ if (*s)
-+ dbgp_num = simple_strtoul(s, &e, 10);
-+ dbgp_printk("dbgp_num: %d\n", dbgp_num);
-+
-+ cap = find_dbgp(dbgp_num, &bus, &slot, &func);
-+ if (!cap)
-+ return -1;
-+
-+ dbgp_printk("Found EHCI debug port on %02x:%02x.%1x\n", bus, slot,
-+ func);
-+
-+ debug_port = read_pci_config(bus, slot, func, cap);
-+ bar = (debug_port >> 29) & 0x7;
-+ bar = (bar * 4) + 0xc;
-+ offset = (debug_port >> 16) & 0xfff;
-+ dbgp_printk("bar: %02x offset: %03x\n", bar, offset);
-+ if (bar != PCI_BASE_ADDRESS_0) {
-+ dbgp_printk("only debug ports on bar 1 handled.\n");
-+
-+ return -1;
-+ }
-+
-+ bar_val = read_pci_config(bus, slot, func, PCI_BASE_ADDRESS_0);
-+ dbgp_printk("bar_val: %02x offset: %03x\n", bar_val, offset);
-+ if (bar_val & ~PCI_BASE_ADDRESS_MEM_MASK) {
-+ dbgp_printk("only simple 32bit mmio bars supported\n");
-+
-+ return -1;
-+ }
-+
-+ /* double check if the mem space is enabled */
-+ byte = read_pci_config_byte(bus, slot, func, 0x04);
-+ if (!(byte & 0x2)) {
-+ byte |= 0x02;
-+ write_pci_config_byte(bus, slot, func, 0x04, byte);
-+ dbgp_printk("mmio for ehci enabled\n");
-+ }
-+
-+ /*
-+ * FIXME I don't have the bar size so just guess PAGE_SIZE is more
-+ * than enough. 1K is the biggest I have seen.
-+ */
-+ set_fixmap_nocache(FIX_DBGP_BASE, bar_val & PAGE_MASK);
-+ ehci_bar = (void __iomem *)__fix_to_virt(FIX_DBGP_BASE);
-+ ehci_bar += bar_val & ~PAGE_MASK;
-+ dbgp_printk("ehci_bar: %p\n", ehci_bar);
-+
-+ ehci_caps = ehci_bar;
-+ ehci_regs = ehci_bar + HC_LENGTH(readl(&ehci_caps->hc_capbase));
-+ ehci_debug = ehci_bar + offset;
-+ ehci_dev.bus = bus;
-+ ehci_dev.slot = slot;
-+ ehci_dev.func = func;
-+
-+ detect_set_debug_port();
-+
-+ ret = ehci_setup();
-+ if (ret < 0) {
-+ dbgp_printk("ehci_setup failed\n");
-+ ehci_debug = NULL;
-+
-+ return -1;
-+ }
-+
-+ return 0;
-+}
-+
-+static void early_dbgp_write(struct console *con, const char *str, u32 n)
-+{
-+ int chunk, ret;
-+
-+ if (!ehci_debug)
-+ return;
-+ while (n > 0) {
-+ chunk = n;
-+ if (chunk > DBGP_MAX_PACKET)
-+ chunk = DBGP_MAX_PACKET;
-+ ret = dbgp_bulk_write(USB_DEBUG_DEVNUM,
-+ dbgp_endpoint_out, str, chunk);
-+ str += chunk;
-+ n -= chunk;
-+ }
-+}
-+
-+struct console early_dbgp_console = {
-+ .name = "earlydbg",
-+ .write = early_dbgp_write,
-+ .flags = CON_PRINTBUFFER,
-+ .index = -1,
-+};
-+
---- /dev/null
-+++ b/drivers/usb/early/Makefile
-@@ -0,0 +1,5 @@
-+#
-+# Makefile for early USB devices
-+#
-+
-+obj-$(CONFIG_EARLY_PRINTK_DBGP) += ehci-dbgp.o
---- a/drivers/usb/Makefile
-+++ b/drivers/usb/Makefile
-@@ -40,6 +40,7 @@ obj-$(CONFIG_USB_MICROTEK) += image/
- obj-$(CONFIG_USB_SERIAL) += serial/
-
- obj-$(CONFIG_USB) += misc/
-+obj-$(CONFIG_USB) += early/
-
- obj-$(CONFIG_USB_ATM) += atm/
- obj-$(CONFIG_USB_SPEEDTOUCH) += atm/
---- a/include/linux/usb/ehci_def.h
-+++ b/include/linux/usb/ehci_def.h
-@@ -170,4 +170,10 @@ struct ehci_dbg_port {
- #define DBGP_EPADDR(dev, ep) (((dev)<<8)|(ep))
- } __attribute__ ((packed));
-
-+#ifdef CONFIG_EARLY_PRINTK_DBGP
-+#include <linux/init.h>
-+extern int __init early_dbgp_init(char *s);
-+extern struct console early_dbgp_console;
-+#endif /* CONFIG_EARLY_PRINTK_DBGP */
-+
- #endif /* __LINUX_USB_EHCI_DEF_H */
diff --git a/usb/usb-printk-early_printk-console-allow-more-than-one-early-console.patch b/usb/usb-printk-early_printk-console-allow-more-than-one-early-console.patch
deleted file mode 100644
index a3ceacf6367b8d..00000000000000
--- a/usb/usb-printk-early_printk-console-allow-more-than-one-early-console.patch
+++ /dev/null
@@ -1,199 +0,0 @@
-From jason.wessel@windriver.com Tue Aug 18 10:46:16 2009
-From: Jason Wessel <jason.wessel@windriver.com>
-Date: Fri, 31 Jul 2009 10:07:08 -0500
-Subject: USB: printk: early_printk,console: Allow more than one early console
-To: gregkh@suse.de
-Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Jason Wessel <jason.wessel@windriver.com>, Ingo Molnar <mingo@elte.hu>, Andrew Morton <akpm@linux-foundation.org>, Yinghai Lu <yinghai@kernel.org>, "Eric W. Biederman" <ebiederm@xmission.com>, Randy Dunlap <randy.dunlap@oracle.com>
-Message-ID: <1249052833-9655-6-git-send-email-jason.wessel@windriver.com>
-
-
-It is very nice to be able to use one early boot device to debug
-another or to have multiple places you can see the early boot
-diagnostics, such as the vga screen or serial device.
-
-This patch changes the early_printk console device registration to
-allow more than one early printk device to get registered via
-register_console().
-
-A corresponding change is required to the console registration code
-such that it will properly unregister any console marked with the
-CON_BOOT flag via a simple loop during a console handover or at late
-init time.
-
-Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
-Cc: Ingo Molnar <mingo@elte.hu>
-Cc: Andrew Morton <akpm@linux-foundation.org>
-Cc: Yinghai Lu <yinghai@kernel.org>
-Cc: "Eric W. Biederman" <ebiederm@xmission.com>
-Cc: Randy Dunlap <randy.dunlap@oracle.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-
----
- arch/x86/kernel/early_printk.c | 63 ++++++++++++++++++++---------------------
- kernel/printk.c | 41 ++++++++++++++++----------
- 2 files changed, 58 insertions(+), 46 deletions(-)
-
---- a/arch/x86/kernel/early_printk.c
-+++ b/arch/x86/kernel/early_printk.c
-@@ -176,10 +176,19 @@ asmlinkage void early_printk(const char
- va_end(ap);
- }
-
-+static inline void early_console_register(struct console *con, int keep_early)
-+{
-+ early_console = con;
-+ if (keep_early)
-+ early_console->flags &= ~CON_BOOT;
-+ else
-+ early_console->flags |= CON_BOOT;
-+ register_console(early_console);
-+}
-
- static int __init setup_early_printk(char *buf)
- {
-- int keep_early;
-+ int keep;
-
- if (!buf)
- return 0;
-@@ -188,42 +197,34 @@ static int __init setup_early_printk(cha
- return 0;
- early_console_initialized = 1;
-
-- keep_early = (strstr(buf, "keep") != NULL);
-+ keep = (strstr(buf, "keep") != NULL);
-
-- if (!strncmp(buf, "serial", 6)) {
-- early_serial_init(buf + 6);
-- early_console = &early_serial_console;
-- } else if (!strncmp(buf, "ttyS", 4)) {
-- early_serial_init(buf);
-- early_console = &early_serial_console;
-- } else if (!strncmp(buf, "vga", 3)
-- && boot_params.screen_info.orig_video_isVGA == 1) {
-- max_xpos = boot_params.screen_info.orig_video_cols;
-- max_ypos = boot_params.screen_info.orig_video_lines;
-- current_ypos = boot_params.screen_info.orig_y;
-- early_console = &early_vga_console;
-+ while (*buf != '\0') {
-+ if (!strncmp(buf, "serial", 6)) {
-+ early_serial_init(buf + 6);
-+ early_console_register(&early_serial_console, keep);
-+ }
-+ if (!strncmp(buf, "ttyS", 4)) {
-+ early_serial_init(buf + 4);
-+ early_console_register(&early_serial_console, keep);
-+ }
-+ if (!strncmp(buf, "vga", 3) &&
-+ boot_params.screen_info.orig_video_isVGA == 1) {
-+ max_xpos = boot_params.screen_info.orig_video_cols;
-+ max_ypos = boot_params.screen_info.orig_video_lines;
-+ current_ypos = boot_params.screen_info.orig_y;
-+ early_console_register(&early_vga_console, keep);
-+ }
- #ifdef CONFIG_EARLY_PRINTK_DBGP
-- } else if (!strncmp(buf, "dbgp", 4)) {
-- if (early_dbgp_init(buf+4) < 0)
-- return 0;
-- early_console = &early_dbgp_console;
-- /*
-- * usb subsys will reset ehci controller, so don't keep
-- * that early console
-- */
-- keep_early = 0;
-+ if (!strncmp(buf, "dbgp", 4) && !early_dbgp_init(buf + 4))
-+ early_console_register(&early_dbgp_console, keep);
- #endif
- #ifdef CONFIG_HVC_XEN
-- } else if (!strncmp(buf, "xen", 3)) {
-- early_console = &xenboot_console;
-+ if (!strncmp(buf, "xen", 3))
-+ early_console_register(&xenboot_console, keep);
- #endif
-+ buf++;
- }
--
-- if (keep_early)
-- early_console->flags &= ~CON_BOOT;
-- else
-- early_console->flags |= CON_BOOT;
-- register_console(early_console);
- return 0;
- }
-
---- a/kernel/printk.c
-+++ b/kernel/printk.c
-@@ -1129,6 +1129,28 @@ void console_start(struct console *conso
- }
- EXPORT_SYMBOL(console_start);
-
-+static int disable_boot_consoles(void)
-+{
-+ struct console *bootconsole = console_drivers;
-+ struct console *nextcon;
-+ if (!bootconsole)
-+ return 0;
-+ while (bootconsole) {
-+ nextcon = bootconsole->next;
-+ if (bootconsole->flags & CON_BOOT) {
-+ printk(KERN_INFO "turn off boot console %s%d\n",
-+ console_drivers->name, console_drivers->index);
-+ if (unregister_console(bootconsole) != 0)
-+ printk(KERN_ERR "ERROR unregistering %s%d\n",
-+ console_drivers->name,
-+ console_drivers->index);
-+ }
-+ bootconsole = nextcon;
-+ }
-+ return 0;
-+}
-+late_initcall(disable_boot_consoles);
-+
- /*
- * The console driver calls this routine during kernel initialization
- * to register the console printing procedure with printk() and to
-@@ -1142,8 +1164,7 @@ void register_console(struct console *co
- struct console *bootconsole = NULL;
-
- if (console_drivers) {
-- if (console->flags & CON_BOOT)
-- return;
-+
- if (console_drivers->flags & CON_BOOT)
- bootconsole = console_drivers;
- }
-@@ -1216,6 +1237,7 @@ void register_console(struct console *co
- console->name, console->index);
- unregister_console(bootconsole);
- console->flags &= ~CON_PRINTBUFFER;
-+ disable_boot_consoles();
- } else {
- printk(KERN_INFO "console [%s%d] enabled\n",
- console->name, console->index);
-@@ -1280,24 +1302,13 @@ int unregister_console(struct console *c
- if (console_drivers != NULL && console->flags & CON_CONSDEV)
- console_drivers->flags |= CON_CONSDEV;
-
-+ if (!res)
-+ console->index = -1;
- release_console_sem();
- return res;
- }
- EXPORT_SYMBOL(unregister_console);
-
--static int __init disable_boot_consoles(void)
--{
-- if (console_drivers != NULL) {
-- if (console_drivers->flags & CON_BOOT) {
-- printk(KERN_INFO "turn off boot console %s%d\n",
-- console_drivers->name, console_drivers->index);
-- return unregister_console(console_drivers);
-- }
-- }
-- return 0;
--}
--late_initcall(disable_boot_consoles);
--
- #if defined CONFIG_PRINTK
-
- /*