BCM47xx: Serial port swapping

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

I am running Debian on a Netgear WGT634U with a ~mainline 2.6.37 kernel. Upon upgrading from .32 I noticed this patch:-

diff --git a/arch/mips/bcm47xx/setup.c b/arch/mips/bcm47xx/setup.c
index 87a3055..c95f90b 100644
--- a/arch/mips/bcm47xx/setup.c
+++ b/arch/mips/bcm47xx/setup.c
@@ -169,12 +169,28 @@ static int bcm47xx_get_invariants(struct ssb_bus *bus,
 void __init plat_mem_setup(void)
 {
 	int err;
+	char buf[100];
+	struct ssb_mipscore *mcore;

 	err = ssb_bus_ssbbus_register(&ssb_bcm47xx, SSB_ENUM_BASE,
 				      bcm47xx_get_invariants);
 	if (err)
 		panic("Failed to initialize SSB bus (err %d)\n", err);

+	mcore = &ssb_bcm47xx.mipscore;
+	if (nvram_getenv("kernel_args", buf, sizeof(buf)) >= 0) {
+		if (strstr(buf, "console=ttyS1")) {
+			struct ssb_serial_port port;
+
+			printk(KERN_DEBUG "Swapping serial ports!\n");
+			/* swap serial ports */
+			memcpy(&port, &mcore->serial_ports[0], sizeof(port));
+			memcpy(&mcore->serial_ports[0], &mcore->serial_ports[1],
+			       sizeof(port));
+			memcpy(&mcore->serial_ports[1], &port, sizeof(port));
+		}

A WGT634U only has the header on the second serial port, this is where CFE outputs it's console by default, and where I have my serial cable attached.

If I specify console=ttyS1, then the above kicks in and the serial port I am attached to becomes ttyS0 early in the boot process, and I loose console output. If I specify console=ttyS0, the above doesn't do anything so the kernel continues to use the unattached serial port. Either way I cannot get any console output without some hacking.

Currently I have removed the block, specified "console=ttyS1" in the commandline, and this gives me working console all the way through boot. I'm happy to test/supply any further patches, solutions I can think of are:-

* Remove it entirely: I think this code has it's origins in OpenWRT code that swapped ports so the userland didn't have to use ttyS1 for a bunch of devices, ttyS0 for another. It's certainly not required to get console output on my device, not tested any other variants of this platform.

* Invert the strstr logic, so that the swap happens if I don't specify ttyS1 as my console. Then regardless of whether I use ttyS0 or ttyS1, I get a console.

* Have a more explict "swap_serial_ports" kernel parameter

Cheers,

--
Jamie Lentin



[Index of Archives]     [Linux MIPS Home]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Linux]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux