Patchwork Serial console issue with 2.6.32

login
register
mail settings
Submitter David Miller
Date Aug. 15, 2010, 7:26 a.m.
Message ID <20100815.002658.27793549.davem@davemloft.net>
Download mbox | patch
Permalink /patch/61752/
State Accepted
Delegated to: David Miller
Headers show

Comments

David Miller - Aug. 15, 2010, 7:26 a.m.
From: Frans Pop <elendil@planet.nl>
Date: Wed, 2 Jun 2010 19:53:34 +0200

> On Wednesday 26 May 2010, David Miller wrote:
>> --------------------
>> sunserial: Don't call add_preferred_console() when console= is
>> specified.
> 
> Thanks for the patch David. I've tried to test with it, but for some reason 
> the box does not boot at all with .34 (both with and without the patch) if 
> I pass console=ttyS0. If I don't pass the parameter it boots fine.

Ok, I think I really got it this time :-)  Please add this patch on
top of the existing stuff.

--------------------
sparc: Really fix "console=" for serial consoles.

If a video head and keyboard are hooked up, specifying "console=ttyS0"
or similar to use a serial console will not work properly.

The key issue is that we must register all serial console capable
devices with register_console(), otherwise the command line specified
device won't be found.  The sun serial drivers would only register
themselves as console devices if the OpenFirmware specified console
device node matched.  To fix this part we now unconditionally get
the serial console register by setting serial_drv->cons always.

Secondarily we must not add_preferred_console() using the firmware
provided console setting if the user gaven an override on the kernel
command line using "console="  The "primary framebuffer" matching
logic was always triggering o n openfirmware device node match, make
it not when a command line override was given.

Reported-by: Frans Pop <elendil@planet.nl>
Signed-off-by: David S. Miller <davem@davemloft.net>
---
 arch/sparc/include/asm/fb.h |    4 ++++
 drivers/serial/suncore.c    |   15 +++++++++------
 2 files changed, 13 insertions(+), 6 deletions(-)
Frans Pop - Aug. 16, 2010, 8:59 a.m.
On Sunday 15 August 2010, David Miller wrote:
> Ok, I think I really got it this time :-)  Please add this patch on
> top of the existing stuff.
>
> --------------
> sparc: Really fix "console=" for serial consoles.
>
> If a video head and keyboard are hooked up, specifying "console=ttyS0"
> or similar to use a serial console will not work properly.
>
> The key issue is that we must register all serial console capable
> devices with register_console(), otherwise the command line specified
> device won't be found.  The sun serial drivers would only register
> themselves as console devices if the OpenFirmware specified console
> device node matched.  To fix this part we now unconditionally get
> the serial console register by setting serial_drv->cons always.
>
> Secondarily we must not add_preferred_console() using the firmware
> provided console setting if the user gaven an override on the kernel
> command line using "console="  The "primary framebuffer" matching
> logic was always triggering o n openfirmware device node match, make
> it not when a command line override was given.

Works great.

Tested on top of previous patch (against 2.6.34; I've not done any kernel 
testing recently and am thus a bit behind).

> Reported-by: Frans Pop <elendil@planet.nl>

s/-by:/-and-tested-by:/

As always: many thanks David!

Cheers,
FJP
--
To unsubscribe from this list: send the line "unsubscribe sparclinux" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
David Miller - Aug. 16, 2010, 7:25 p.m.
From: Frans Pop <elendil@planet.nl>
Date: Mon, 16 Aug 2010 10:59:28 +0200

> Works great.
> 
> Tested on top of previous patch (against 2.6.34; I've not done any kernel 
> testing recently and am thus a bit behind).
> 
>> Reported-by: Frans Pop <elendil@planet.nl>
> 
> s/-by:/-and-tested-by:/
> 
> As always: many thanks David!
> 

Thanks a lot for everything Frans.
--
To unsubscribe from this list: send the line "unsubscribe sparclinux" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch

diff --git a/arch/sparc/include/asm/fb.h b/arch/sparc/include/asm/fb.h
index e834880..2173432 100644
--- a/arch/sparc/include/asm/fb.h
+++ b/arch/sparc/include/asm/fb.h
@@ -1,5 +1,6 @@ 
 #ifndef _SPARC_FB_H_
 #define _SPARC_FB_H_
+#include <linux/console.h>
 #include <linux/fb.h>
 #include <linux/fs.h>
 #include <asm/page.h>
@@ -18,6 +19,9 @@  static inline int fb_is_primary_device(struct fb_info *info)
 	struct device *dev = info->device;
 	struct device_node *node;
 
+	if (console_set_on_cmdline)
+		return 0;
+
 	node = dev->of_node;
 	if (node &&
 	    node == of_console_device)
diff --git a/drivers/serial/suncore.c b/drivers/serial/suncore.c
index 544f2e2..6381a02 100644
--- a/drivers/serial/suncore.c
+++ b/drivers/serial/suncore.c
@@ -55,7 +55,12 @@  EXPORT_SYMBOL(sunserial_unregister_minors);
 int sunserial_console_match(struct console *con, struct device_node *dp,
 			    struct uart_driver *drv, int line, bool ignore_line)
 {
-	if (!con || of_console_device != dp)
+	if (!con)
+		return 0;
+
+	drv->cons = con;
+
+	if (of_console_device != dp)
 		return 0;
 
 	if (!ignore_line) {
@@ -69,12 +74,10 @@  int sunserial_console_match(struct console *con, struct device_node *dp,
 			return 0;
 	}
 
-	con->index = line;
-	drv->cons = con;
-
-	if (!console_set_on_cmdline)
+	if (!console_set_on_cmdline) {
+		con->index = line;
 		add_preferred_console(con->name, line, NULL);
-
+	}
 	return 1;
 }
 EXPORT_SYMBOL(sunserial_console_match);