2006-08-25 19:58:54

by Michael Tokarev

[permalink] [raw]
Subject: How to identify serial ports (ttySn)?

On a regular basis, /dev/ttySnn devices gets
renumbered with next kernel version.

For example, we've a PCI serial card (NetMos in
this case), with, say, one serial port on it.
Plus some ports on the motherboard (usually one
or two). The question is where's the NetMos port,
on which /dev/ttySnn?

Some time ago, probably at the time of linux 2.4,
netmos device number was dependent on the max.
number of "standard" serial ports configured in
the kernel during compile. Ie, if it where set
to 8 (ttyS0..ttyS7), netmos one becomes ttyS8.
If set to 4, netmos was ttyS4 etc. I always
configured 8 ports in the kernel, so my netmos
card was always been ttyS8.

Next, with 2.6.something which was the first 2.6
I tried, it suddenly become ttyS4. I don't remember
the details already. So I reconfigured all the
machines (it was UPS control program which is
sitting on that port) to use another device.

At least 2.6.11 assigns ttyS3 to the device, saying
the first two ports are reserved for the onboard
devices. So I again reconfigured the app to use
ttyS3 (or ttyS2 - I'm not sure).

Now, with 2.6.17, the netmos port is ttyS1. Because
in reality, on the motherboard there's only one
serial port soldered (that's the reason why we
got the netmos card in the first place), so "next
unused" device is ttyS1.

So the question is: how to find where's the thing
on the running kernel, and where it will be with
next version? Is there a way to assign a name for
the thing, so it will be independent of the current
kernel? I just want to use it, the hardware is
*constant* for several years, but each kernel
release gives yet another surprize, here or there.

And please don't tell me that's some udev thing.
there's no need to run that f*cked udev on all
those machines, the hardware is stable for many
years, there's no hotpluggable, usb or not,
devices of any sort.

More, there's no way to assign constant name for
that thing with udev, too - it seems. Serial
ports exports no useful information to be
identified.

Thanks.

/mjt


2006-08-25 23:39:09

by Russell King

[permalink] [raw]
Subject: Re: How to identify serial ports (ttySn)?

On Fri, Aug 25, 2006 at 11:58:47PM +0400, Michael Tokarev wrote:
> For example, we've a PCI serial card (NetMos in
> this case), with, say, one serial port on it.
> Plus some ports on the motherboard (usually one
> or two). The question is where's the NetMos port,
> on which /dev/ttySnn?

/sys/devices/pciwhatever/tty:ttyS*

> Next, with 2.6.something which was the first 2.6
> I tried, it suddenly become ttyS4. I don't remember
> the details already. So I reconfigured all the
> machines (it was UPS control program which is
> sitting on that port) to use another device.
>
> At least 2.6.11 assigns ttyS3 to the device, saying
> the first two ports are reserved for the onboard
> devices. So I again reconfigured the app to use
> ttyS3 (or ttyS2 - I'm not sure).
>
> Now, with 2.6.17, the netmos port is ttyS1. Because
> in reality, on the motherboard there's only one
> serial port soldered (that's the reason why we
> got the netmos card in the first place), so "next
> unused" device is ttyS1.
>
> So the question is: how to find where's the thing
> on the running kernel, and where it will be with
> next version? Is there a way to assign a name for
> the thing, so it will be independent of the current
> kernel? I just want to use it, the hardware is
> *constant* for several years, but each kernel
> release gives yet another surprize, here or there.

No idea, but at a guess your kernel configuration changed in some way,
or you didn't think enough about the new options which were added.

The behaviour of serial has not changed - if the port is already known
to the kernel, it does it's damnest best to keep the same port.

If it isn't already known, it will look for the first totally unused
port and unassigned port which has not been previously used.

If it can't find one, it'll find an unused port which has been
previously used.

No idea what changed between 2.6.something and 2.6.11 - do you have the
contents of /proc/tty/driver/serial without the PCI driver loaded in
each case? If not, can't help, sorry.

In the 2.6.11 to 2.6.17 case, you've been bitten by the "only want present
ports to appear in my kernel thankyou" udev-based lobby. There's now a
configuration option/kernel command line/8250 module option to set the
number of ports. It sounds like your kernel has it set to 2, causing
only ttyS0 and ttyS1 to be available.

In the kernel configuration, it's called 'SERIAL_8250_RUNTIME_UARTS'.
On the kernel command line, it's something like '8250.nr_uarts', and
the module option is 'nr_uarts'.

If you set this to 4 + number of PCI serial ports, you'll get your
PCI ports starting at ttyS4 as it was in old times.

(Note: this is not a change I approved of - I knew it would cause people
problems, so please don't direct your anger, which is obvious from your
email, at me.)

--
Russell King
Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/
maintainer of: 2.6 Serial core