Skip to contentSkip to conversation

IP22: fix serial console hangs

PATCH Applied Julien BLACHE 4 participants 7 messages Jul 9, 2006

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 IP22: fix serial console hangs

Hi,

The patch below fixes serial console hangs as seen on IP22 machines. Typically, while booting, the machine hangs for ~1 minute displaying "INIT: ", then the same thing happens again when init enters in the designated runlevel and finally the getty process on ttyS0 hangs indefinitely (though strace'ing it helps).

strace (-e raw=ioctl, otherwise the ioctl() translation is utterly bogus) reveals that getty hangs on ioctl() 0x540f which happens to be TCSETSW (I saw it hang on another console ioctl() but couldn't reproduce that one).

A diff between ip22zilog and sunzilog revealed the following differences:
1. the channel A flag being set on up.port.flags instead of up.flags
2. the channel A flag being set on what is marked as being channel B
3. sunzilog has a call to uart_update_timeout(port, termios->c_cflag, baud); at the end of sunzilog_set_termios(), which ip22zilog lacks (on purpose ?)

The patch below addresses point 1 and fixes the serial console hangs just fine. However point 2 should be investigated by someone familiar with the IP22 Zilog; it's probably OK as is but even if it is, a comment in ip22zilog.c is badly needed.

Point 3 is left as an exercise for whoever feels like digging into ip22zilog :)

These are the main obvious differences between ip22zilog and sunzilog. Newer versions of sunzilog (Linus's git tree as of today) are more close to ip22zilog as the sbus_{write,read}b have been changed into simple {write,read}b, which shrinks the diff by a fair amount. Resyncing both drivers should be doable in a few hours time now for someone familiar with the IP22 Zilog hardware.

Additional point: the IP22 thinks it's using the console on the framebuffer when booting, when it's really using the serial console (console=ttyS passed at boot, console=d, consoleOut=serial(0))

Please apply, along with the RTC typo fix from yesterday.

Thanks,

JB.

---
IP22: fix serial console hang due to a typo in ip22zilog.c

drivers/serial/ip22zilog.c +1 -2
@@ -1145,9 +1145,8 @@
 		up[(chip * 2) + 1].port.fifosize = 1;
 		up[(chip * 2) + 1].port.ops = &ip22zilog_pops;
 		up[(chip * 2) + 1].port.type = PORT_IP22ZILOG;
-		up[(chip * 2) + 1].port.flags |= IP22ZILOG_FLAG_IS_CHANNEL_A;
 		up[(chip * 2) + 1].port.line = (chip * 2) + 1;
-		up[(chip * 2) + 1].flags = 0;
+		up[(chip * 2) + 1].flags |= IP22ZILOG_FLAG_IS_CHANNEL_A;
 	}
 }
 
Signature · 5 lines
-- 
 Julien BLACHE <[email protected]>  |  Debian, because code matters more 
 Debian & GNU/Linux Developer        |       <http://www.debian.org>
 Public key available on <http://www.jblache.org> - KeyID: F5D6 5169 
 GPG Fingerprint : 935A 79F1 C8B3 3521 FD62 7CC7 CD61 4FD7 F5D6 5169 
#1 lore raw
Quoted 8 lines · Julien BLACHE

Hi,

The patch below fixes serial console hangs as seen on IP22 machines. Typically, while booting, the machine hangs for ~1 minute displaying "INIT: ", then the same thing happens again when init enters in the designated runlevel and finally the getty process on ttyS0 hangs indefinitely (though strace'ing it helps).

Out of curiosity, don't suppose you've seen the oops on IP22 that can sometimes be triggered by closing the serial client on another box? Haven't investigated it too much, but I've seen the odd case on Indy and IP28 (which also uses the zilog driver) where shutting down my serial client or sometimes rebooting the system running the client oopses the driver. I suspect some rogue data gets passed that zilog doesn't know how to handle properly.

--Kumba

Signature · 4 lines
Gentoo/MIPS Team Lead
Gentoo Foundation Board of Trustees

"Such is oft the course of deeds that move the wheels of the world: small hands do them because they must, while the eyes of the great are elsewhere."  --Elrond
#2 lore raw

Kumba <[email protected]> wrote:

Hi,

Quoted 2 lines

Out of curiosity, don't suppose you've seen the oops on IP22 that can sometimes be triggered by closing the serial client on another box?

Haven't seen this one, no. I'm using a hardware console on the serial line most of the time (though I still haven't found the proper configuration and it's hardly usable for anything advanced making use of terminal features).

Quoted 5 lines

Haven't investigated it too much, but I've seen the odd case on Indy and IP28 (which also uses the zilog driver) where shutting down my serial client or sometimes rebooting the system running the client oopses the driver. I suspect some rogue data gets passed that zilog doesn't know how to handle properly.

It looks a bit like the serial driver crash on reboot which Martin Michlmayr fixed a couple of months back by backporting fixes from the sunzilog driver. But I think this one made its way into the kernel, so it must be something else.

JB.

Signature · 4 lines
 Julien BLACHE <[email protected]>  |  Debian, because code matters more 
 Debian & GNU/Linux Developer        |       <http://www.debian.org>
 Public key available on <http://www.jblache.org> - KeyID: F5D6 5169 
 GPG Fingerprint : 935A 79F1 C8B3 3521 FD62 7CC7 CD61 4FD7 F5D6 5169 
#4 lore raw

Martin Michlmayr <[email protected]> wrote:

Hi,

Quoted 6 lines
Quoted 2 lines

The patch below fixes serial console hangs as seen on IP22 machines. Typically, while booting, the machine hangs for ~1 minute

Thanks for tracking this down. You've to send the patch to [email protected] and [email protected] though.

Here it is for the serial hackers, then ;)

The patch below fixes serial console hangs as seen on IP22 machines. Typically, while booting, the machine hangs for ~1 minute displaying "INIT: ", then the same thing happens again when init enters in the designated runlevel and finally the getty process on ttyS0 hangs indefinitely (though strace'ing it helps).

strace (-e raw=ioctl, otherwise the ioctl() translation is utterly bogus) reveals that getty hangs on ioctl() 0x540f which happens to be TCSETSW (I saw it hang on another console ioctl() but couldn't reproduce that one).

A diff between ip22zilog and sunzilog revealed the following differences:
1. the channel A flag being set on up.port.flags instead of up.flags
2. the channel A flag being set on what is marked as being channel B
3. sunzilog has a call to uart_update_timeout(port, termios->c_cflag, baud); at the end of sunzilog_set_termios(), which ip22zilog lacks (on purpose ?)

The patch below addresses point 1 and fixes the serial console hangs just fine. However point 2 should be investigated by someone familiar with the IP22 Zilog; it's probably OK as is but even if it is, a comment in ip22zilog.c is badly needed.

Point 3 is left as an exercise for whoever feels like digging into ip22zilog :)

These are the main obvious differences between ip22zilog and sunzilog. Newer versions of sunzilog (Linus's git tree as of today) are more close to ip22zilog as the sbus_{write,read}b have been changed into simple {write,read}b, which shrinks the diff by a fair amount. Resyncing both drivers should be doable in a few hours time now for someone familiar with the IP22 Zilog hardware.

Additional point: the IP22 thinks it's using the console on the framebuffer when booting, when it's really using the serial console (console=ttyS passed at boot, console=d, consoleOut=serial(0))

Please apply, along with the RTC typo fix from yesterday.

Thanks,

JB.

---
IP22: fix serial console hang due to a typo in ip22zilog.c

drivers/serial/ip22zilog.c +1 -2
@@ -1145,9 +1145,8 @@
 		up[(chip * 2) + 1].port.fifosize = 1;
 		up[(chip * 2) + 1].port.ops = &ip22zilog_pops;
 		up[(chip * 2) + 1].port.type = PORT_IP22ZILOG;
-		up[(chip * 2) + 1].port.flags |= IP22ZILOG_FLAG_IS_CHANNEL_A;
 		up[(chip * 2) + 1].port.line = (chip * 2) + 1;
-		up[(chip * 2) + 1].flags = 0;
+		up[(chip * 2) + 1].flags |= IP22ZILOG_FLAG_IS_CHANNEL_A;
 	}
 }
 
Signature · 5 lines
-- 
 Julien BLACHE <[email protected]>  |  Debian, because code matters more 
 Debian & GNU/Linux Developer        |       <http://www.debian.org>
 Public key available on <http://www.jblache.org> - KeyID: F5D6 5169 
 GPG Fingerprint : 935A 79F1 C8B3 3521 FD62 7CC7 CD61 4FD7 F5D6 5169 
Applied
#5 lore raw
Quoted 5 lines · Julien BLACHE

The patch below fixes serial console hangs as seen on IP22 machines. Typically, while booting, the machine hangs for ~1 minute displaying "INIT: ", then the same thing happens again when init enters in the designated runlevel and finally the getty process on ttyS0 hangs indefinitely (though strace'ing it helps).

Applied, thanks.

Signature · 3 lines
Russell King
 Linux kernel    2.6 ARM Linux   - http://www.arm.linux.org.uk/
 maintainer of:  2.6 Serial core
#6 lore raw
In reply to Martin Michlmayr
Quoted 7 lines · Martin Michlmayr
Quoted 2 lines · Julien BLACHE

The patch below fixes serial console hangs as seen on IP22 machines. Typically, while booting, the machine hangs for ~1 minute

Thanks for tracking this down. You've to send the patch to [email protected] and [email protected] though.

Done.

JB.

Signature · 4 lines
 Julien BLACHE <[email protected]>  |  Debian, because code matters more 
 Debian & GNU/Linux Developer        |       <http://www.debian.org>
 Public key available on <http://www.jblache.org> - KeyID: F5D6 5169 
 GPG Fingerprint : 935A 79F1 C8B3 3521 FD62 7CC7 CD61 4FD7 F5D6 5169