Subject: puc(4) card with a weird setup
To: None <>
From: Quentin Garnier <>
List: tech-kern
Date: 10/13/2005 12:15:10
Hi all,

I've just bought 8-serial-ports PCI cards sold by ExSys.  They have two
chips on it: OxSemi OX16PCI954 and OX16C954.  Each of the chips handle 4
serial ports, but the whole thing has a very specific design.

We already have support for the OX16PCI954, function 0.  When it appears
as device ID 0x9501, it is a 4-ports device and all is well, 4 com(4)
ports attach.  No issue here.

The OX16PCI954 chip, however, has extended abilities through another PCI
device at function 1, which can be several things.  It can be a parallel
port, and we have support for it.

But it can also be a bridge to a 8-bits local bus, on which you can have
another chip(s).  In the case of the cards I bought, it is an 0X16C954
(which is pretty much the same thing as the OX16PCI954, sans the PCI
aspect) which handles 4 serial ports.

The following patch makes my card work on NetBSD, but it will only work
in that case.  I don't way a way to make it work in a more generic case.

FWIW, I've looked at what Linux does, and it takes a slightly different
approach.  It looks at the size of the I/O BAR, divides it by the size
for one of the port, and infer the number of them that way.  Basically,
it assumes that there are serial ports on the 8-bits bus, and that it
will access them the same way as the others.

I have no idea how I could detect there is an OX16C954 behind the

Any suggestion on how to properly support that card on NetBSD?

Quentin Garnier.

Index: pucdata.c
RCS file: /pub/NetBSD-CVS/src/sys/dev/pci/pucdata.c,v
retrieving revision 1.40
diff -u -r1.40 pucdata.c
--- pucdata.c	27 Feb 2005 00:27:34 -0000	1.40
+++ pucdata.c	13 Oct 2005 09:58:05 -0000
@@ -897,6 +897,18 @@
+	/* Oxford Semiconductor OX16PCI954 PCI UARTs on function 1 */
+	{   "Oxford Semiconductor OX16PCI954 Secondary UARTs",
+	    {	0x1415,	0x9511,	0,	0	},
+	    {	0xffff,	0xffff,	0,	0	},
+	    {
+		{ PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ },
+		{ PUC_PORT_TYPE_COM, 0x10, 0x08, COM_FREQ },
+		{ PUC_PORT_TYPE_COM, 0x10, 0x10, COM_FREQ },
+		{ PUC_PORT_TYPE_COM, 0x10, 0x18, COM_FREQ },
+	    },
+	},
 	/* Oxford Semiconductor OX16PCI954 PCI Parallel port */
 	{   "Oxford Semiconductor OX16PCI954 Parallel port",
 	    {	0x1415,	0x9513,	0,	0	},