Re: Serial console only works after reboot?

From: Bruce Evans <bde_at_zeta.org.au>
Date: Mon, 5 Jan 2004 17:37:52 +1100 (EST)
On Sun, 4 Jan 2004, Nate Lawson wrote:

> On Sun, 4 Jan 2004, M. Warner Losh wrote:
> > In message: <20040103233044.N17367_at_root.org>
> >             Nate Lawson <nate_at_root.org> writes:
> > : On Sat, 3 Jan 2004, M. Warner Losh wrote:
> > : > In message: <20040103184934.V16815_at_root.org>
> > : >             Nate Lawson <nate_at_root.org> writes:
> > : > : I have a laptop (IBM T23) and use sio0 as my console/gdb port.  One thing
> > : > : I noticed is if I power up the laptop and boot -h, I get garbage out the
> > : > : serial port.  However, if I boot fully and then just warm reboot, the
> > : > : serial console works fine.  I'm only using 9600 bps.  Ideas?
> > : >
> > : > weird.  Is the garbage data at some different rate?
> > :
> > : Nope, checked everything from 1200 up to 38400, different garbage but
> > : always garbage.  This is with -current as of 2003/12/30, no patches.
> >
> > Try 115200.
>
> That works.

Is this with just changing the external tty to 115200 and no config changes?

> Now the question is "why".  Note that I have no "options
> CONSPEED" so according to /sys/dev/sio/sioreg.h, it should default to 9600
> and indeed does, after a reboot.  But not on a cold startup.

As mentioned in other replies, CONSPEED is irrelevant for serial consoles
in many cases.  The speed is normally determined by BOOT_COMCONSOLE_SPEED
(or its default of 9600).
Exceptions:
- the kernel console may be a serial one even if the boot blocks don't
  use or set a serial console.  This happens when there is no other
  preferred console, or if you switch to a serial console using
  "sysctl kern.console=...".  Then CONSPEED (or its default of 9600) is
  used initially.
- the initial setting of the console speed may be changed using
  "sysctl machdep.conspeed".
- if the "serial console" is actually just a gdb port, then it won't
  be affected by BOOT_COMCONSOLE_SPEED.  Then GDBSPEED (or its default
  of CONSPEED) is used initially.
- the initial setting of the gdb speed may be changed using
  "sysctl machdep.gdbspeed".  This sysctl is sloppier than the one for
  consoles -- it is just a SYSCTL_INT() and doesn't adjust any associated
  state (mainly speeds for other uses of the port).
- if the serial console is also the gdb port, then the gdb speed is used
  for gdb and the console speed is used for console i/o.  There is also
  a speed for the high-level tty.  Speed setting is mostly dynamic (the
  speed normally set for the high-level tty and switched on every character
  for console and gdb i/o), so garbled output may result even for the
  speed that matches the external device if the 3 speed settings are not
  all the same.  Console i/o usually works in this case though.

Add some printfs to see which of the speed settings are different, and
fix whatever sets an inconsistent one.

Bruce
Received on Sun Jan 04 2004 - 21:38:11 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:37:36 UTC