diff options
| author | Greg Kroah-Hartman <gregkh@suse.de> | 2009-08-19 16:44:29 -0700 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-08-19 16:44:29 -0700 |
| commit | bd43dd37720db9b7a65b2bf06a0b9c9f523630d0 (patch) | |
| tree | 64876676cf2948f0283fd2bb2c1d639823760026 /usb | |
| parent | 61c6bd8febccb4ad734226a9782a3ae27db1017c (diff) | |
| download | patches-bd43dd37720db9b7a65b2bf06a0b9c9f523630d0.tar.gz | |
remove ehci printk stuff, it breaks -tip
Diffstat (limited to 'usb')
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 - - /* |
