public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* 2.6.x kernels and ttyS45 for 6 serial ports ?
@ 2004-04-05 10:35 Ruud Linders
  2004-04-05 11:04 ` Russell King
  0 siblings, 1 reply; 6+ messages in thread
From: Ruud Linders @ 2004-04-05 10:35 UTC (permalink / raw)
  To: linux-kernel


Some time ago I reported that serial ports numbering on 2.5.x/2.6.x
was rather weird when used with a 4-serial port PCI card and 2
standard onboard serial ports.
I got devices ttyS0/1/14/15/2/3 or something.

Now checking this on 2.6.5 it got more confusing, I now have with
total of 6 serial ports a device number ttyS45 !?

The way this device numbering seems to work is that many device names
are reserved in include/asm/serial.h for devices like fourport/boca/hub6.
Anything else (=all PCI cards?) gets a number still unassigned.

Note that eg. the SCSI disk equivalent of this strategy would be to
reserver eg. sda-sde for IBM disks and other brands start
numbering at sdf !

Attached patch 'fixes' this for me, been using it for past
6 months or so.

Regards,
         Ruud Linders

__

Dmesg from 2.6.5
================
Serial: 8250/16550 driver $Revision: 1.90 $ 48 ports, IRQ sharing enabled
ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
ttyS14 at I/O 0xb800 (irq = 21) is a 16550A
ttyS15 at I/O 0xb808 (irq = 21) is a 16550A
ttyS44 at I/O 0xb810 (irq = 21) is a 16550A
ttyS45 at I/O 0xb818 (irq = 21) is a 16550A

Applied this patch on stock 2.6.5
=================================
--- serial_core.c.ORIG  2004-03-19 18:29:20.000000000 +0100
+++ serial_core.c       2004-04-05 12:32:33.000000000 +0200
@@ -2306,17 +2306,6 @@
                         return &drv->state[i];

         /*
-        * We didn't find a matching entry, so look for the first
-        * free entry.  We look for one which hasn't been previously
-        * used (indicated by zero iobase).
-        */
-       for (i = 0; i < drv->nr; i++)
-               if (drv->state[i].port->type == PORT_UNKNOWN &&
-                   drv->state[i].port->iobase == 0 &&
-                   drv->state[i].count == 0)
-                       return &drv->state[i];
-
-       /*
          * That also failed.  Last resort is to find any currently
          * entry which doesn't have a real port associated with it.
          */


And now I get this more logical numbering
=========================================
Serial: 8250/16550 driver $Revision: 1.90 $ 48 ports, IRQ sharing enabled
ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
ttyS2 at I/O 0xb800 (irq = 21) is a 16550A
ttyS3 at I/O 0xb808 (irq = 21) is a 16550A
ttyS4 at I/O 0xb810 (irq = 21) is a 16550A
ttyS5 at I/O 0xb818 (irq = 21) is a 16550A


^ permalink raw reply	[flat|nested] 6+ messages in thread
* Re: 2.6.x kernels and ttyS45 for 6 serial ports ?
@ 2004-04-06 16:37 Bjorn Helgaas
  2004-04-06 16:45 ` Bjorn Helgaas
  0 siblings, 1 reply; 6+ messages in thread
From: Bjorn Helgaas @ 2004-04-06 16:37 UTC (permalink / raw)
  To: Ruud Linders; +Cc: linux-kernel, Russell King

> The way this device numbering seems to work is that many device names
> are reserved in include/asm/serial.h for devices like fourport/boca/hub6.
> Anything else (=all PCI cards?) gets a number still unassigned.

Right.  Names for everything in SERIAL_PORT_DFNS get reserved.  For
boxes with ACPI, we don't need SERIAL_PORT_DFNS at all (assuming you
build with CONFIG_SERIAL_8250_ACPI).  ia64, for example, doesn't
define SERIAL_PORT_DFNS, so ports just get named sequentially in the
order they're discovered.

The following (untested) patch should give you the same behavior
when you supply the "noisaserial" argument.  Note that this probably
won't work if you're using a serial console, because early serial
registration will fill in the ISA ports before "noisaserial" gets
parsed.

===== Documentation/kernel-parameters.txt 1.44 vs edited =====
--- 1.44/Documentation/kernel-parameters.txt	Mon Mar 22 14:03:22 2004
+++ edited/Documentation/kernel-parameters.txt	Tue Apr  6 09:39:07 2004
@@ -714,6 +714,8 @@
 
 	noisapnp	[ISAPNP] Disables ISA PnP code.
 
+	noisaserial	[SERIAL] Disables probing for legacy ISA serial ports.
+
 	noinitrd	[RAM] Tells the kernel not to load any configured
 			initial RAM disk.
 
===== drivers/serial/8250.c 1.48 vs edited =====
--- 1.48/drivers/serial/8250.c	Mon Mar 15 15:16:26 2004
+++ edited/drivers/serial/8250.c	Tue Apr  6 09:41:16 2004
@@ -117,6 +117,15 @@
 
 #define UART_NR	(ARRAY_SIZE(old_serial_port) + CONFIG_SERIAL_8250_NR_UARTS)
 
+static int __init serial_probe_isa = 1;
+
+static int __init noisaserial(char *str)
+{
+	serial_probe_isa = 0;
+	return 1;
+}
+__setup("noisaserial", noisaserial);
+
 #if defined(CONFIG_SERIAL_8250_RSA) && defined(MODULE)
 
 #define PORT_RSA_MAX 4
@@ -1836,7 +1845,7 @@
 	static int first = 1;
 	int i;
 
-	if (!first)
+	if (!first || !serial_probe_isa)
 		return;
 	first = 0;
 

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2004-04-06 16:48 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-04-05 10:35 2.6.x kernels and ttyS45 for 6 serial ports ? Ruud Linders
2004-04-05 11:04 ` Russell King
2004-04-05 14:08   ` Ruud Linders
2004-04-05 14:21     ` Arjan van de Ven
  -- strict thread matches above, loose matches on Subject: below --
2004-04-06 16:37 Bjorn Helgaas
2004-04-06 16:45 ` Bjorn Helgaas

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox