Sunix 4056A PCI 4 port RS-232 card - only 2 ports configured

John Baldwin jhb at freebsd.org
Tue May 24 20:10:52 UTC 2011


On Tuesday, May 24, 2011 4:01:00 pm N.J. Mann wrote:
> In message <201105241341.49546.jhb at freebsd.org>,
> 	John Baldwin (jhb at freebsd.org) wrote:
> > On Tuesday, May 24, 2011 11:58:10 am N.J. Mann wrote:
> > > In message <201105240755.38404.jhb at freebsd.org>,
> > > 	John Baldwin (jhb at freebsd.org) wrote:
> > > > On Monday, May 23, 2011 11:17:08 am N.J. Mann wrote:
> > > > > In message <201105231026.54178.jhb at freebsd.org>,
> > > > > 	John Baldwin (jhb at freebsd.org) wrote:
> > > > > > On Sunday, May 22, 2011 7:00:02 am N.J. Mann wrote:
> > > > > > > Hi,
> > > > > > > 
> > > > > > > 
> > > > > > > I am trying to setup a console server, but I am having a problem 
> > with
> > > > > > > the hardware.  The RS-232 card I am using is a Sunix 4056A 
Universal 
> > PCI
> > > > > > > 4 port RS-232 card.  However, only two ports are being 
configured, 
> > uart2
> > > > > > > and uart3 - uart0 and uart1 are on the motherboard.  I had 
assumed 
> > that
> > > > > > > all I had to do was install the card, add puc(4) to my kernel 
and it
> > > > > > > would just work.
> > > > > > > 
> > > > > > > uname:
> > > > > > > ------
> > > > > > > FreeBSD 9.0-CURRENT #0: Thu May 19 15:01:10 UTC 2011 i386
> > > > > > > 
> > > > > > > I CVSup'ed about fours before then.
> > > > > > > 
> > > > > > > 
> > > > > > > relevant parts of verbose dmesg:
> > > > > > > --------------------------------
> > > > > > > found->	vendor=0x1409, dev=0x7168, revid=0x01
> > > > > > > 	domain=0, bus=0, slot=10, func=0
> > > > > > > 	class=07-00-02, hdrtype=0x00, mfdev=0
> > > > > > > 	cmdreg=0x0081, statreg=0x0280, cachelnsz=0 (dwords)
> > > > > > > 	lattimer=0x00 (0 ns), mingnt=0x00 (0 ns), maxlat=0x00 (0 ns)
> > > > > > > 	intpin=a, irq=3
> > > > > > > 	map[10]: type I/O Port, range 32, base 0xe000, size  5, 
enabled
> > > > > > > 	map[14]: type I/O Port, range 32, base 0xe400, size  4, 
enabled
> > > > > > > pcib0: matched entry for 0.10.INTA
> > > > > > > pcib0: slot 10 INTA hardwired to IRQ 18
> > > > > > > [...]
> > > > > > > puc0: <Timedia technology 4 Port Serial> port 
> > 0xe000-0xe01f,0xe400-0xe40f 
> > > > > > >   irq 18 at device 10.0 on pci0
> > > > > > > ioapic0: routing intpin 18 (PCI IRQ 18) to lapic 0 vector 52
> > > > > > > uart2: <16550 or compatible> on puc0
> > > > > > > uart2: fast interrupt
> > > > > > > uart3: <16550 or compatible> on puc0
> > > > > > > uart3: fast interrupt
> > > > > > > 
> > > > > > > 
> > > > > > > I can provide a full verbose dmesg if required, together with 
any 
> > other
> > > > > > > information which may be relevant.
> > > > > > > 
> > > > > > > Any and all help gratefully received.
> > > > > > 
> > > > > > Hmm, for Timedia it looks like the puc(4) driver uses the 
subvendor 
> > device ID 
> > > > > > to figure out how many ports your card has, but it does see 4 
ports 
> > (the
> > > > > > device descrption is correct).  Does 'devinfo -v' show any other 
child
> > > > > > devices of 'puc0' besides the two uart devices?
> > > > > 
> > > > > No.
> > > > > 
> > > > > puc0 pnpinfo vendor=0x1409 device=0x7168 subvendor=0x1409 
> > subdevice=0x4056 class=0x070002 at slot=10 function=0
> > > > >   uart2
> > > > >   uart3
> > > > > 
> > > > > (If you want the complete output of devinfo just ask - I assumed 
from
> > > > > your question you only wanted the puc-releated section.)
> > > > 
> > > > Yeah, this is all I wanted.  Hmm, so from the description we can see 
that
> > > > it thinks you have 4 ports:
> > > > 
> > > > 		snprintf(desc, sizeof(desc),
> > > > 		    "Timedia technology %d Port Serial", (int)sc-
>sc_cfg_data);
> > > > 
> > > > and the code that sets sc_cfg_data sets it to the number of supported 
> > ports
> > > > that PUC_CFG_GET_NPORTS returns:
> > > > 
> > > > 	case PUC_CFG_GET_NPORTS:
> > > > 	...
> > > > 				if (subdev == subdevs[dev].ids[id]) {
> > > > 					sc->sc_cfg_data = subdevs[dev].ports;
> > > > 					*res = sc->sc_cfg_data;
> > > > 					return (0);
> > > > 				}
> > > 
> > > The above code returns 4 each time it is called - three times.
> > > 
> > > > 
> > > > You might need to just add some printfs to puc_bfe_attach().  It would 
be 
> > good
> > > > to see if the PUC_CFG_GET_NPORTS request in attach also returned 4 in 
res 
> > (the
> > > > description string is set in puc_bfe_probe()).
> > > 
> > > Okay, lots of printf's later. :-)
> > > 
> > > In put_bfe_attach() the second 'for' loop which starts with the comment
> > > "Probe and attach our children." - puc.c line 352 - the call to
> > > device_probe_and_attach passes for the first two ports, but fails for
> > > the second two with an error code of 6.  Does that make any sense to
> > > you?
> > 
> > Ahh, can you comment out the 'device_delete_child' bit for now?  It might 
be 
> > worth adding some tracing to see if uart_puc_probe() is being called and 
if so 
> > why it is failing.
> 
> I commented out device_delete_child and then added printf's in
> uart_pub_probe() and uart_bus_probe.  It is UART_PROBE which is
> returning 6 for the second two ports.  I must be missing something
> because I cannot find where UART_PROBE is defined.  Any chance of giving
> me a clue?  :-)

Ah, uart_puc_probe() always uses the 'uart_ns8250_class' uart driver which
is defined in uart_dev_ns8250.c.  ns8250_bus_probe() is what you want to
instrument I think.

-- 
John Baldwin


More information about the freebsd-hardware mailing list