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

N.J. Mann njm at njm.me.uk
Thu May 26 13:12:15 UTC 2011


Hi John,


In message <201105250946.45653.jhb at freebsd.org>,
	John Baldwin (jhb at freebsd.org) wrote:
> On Tuesday, May 24, 2011 5:52:32 pm N.J. Mann wrote:
> > In message <201105241610.49930.jhb at freebsd.org>,
> > 	John Baldwin (jhb at freebsd.org) wrote:
> > [snip]
> > > 
> > > 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.
> > 
> > ns8250_bus_probe() is called twice for each of the working devices as
> > follows:
> > 
> > UART2:
> > ------
> > ns8250_bus_probe:: entry
> > ns8250_probe::uart_getreg REG_IIR = 1
> > ns8250_probe::uart_getreg REG_MCR = 0
> > ns8250_bus_probe:: exit
> > ...
> > ns8250_bus_probe:: entry
> > ns8250_probe::uart_getreg REG_IIR = 193
> > ns8250_probe::uart_getreg REG_MCR = 8
> > ns8250_bus_probe:: exit
> > 
> > UART3
> > -----
> > ns8250_bus_probe:: entry
> > ns8250_probe::uart_getreg REG_IIR = 1
> > ns8250_probe::uart_getreg REG_MCR = 0
> > ns8250_bus_probe:: exit
> > ...
> > ns8250_bus_probe:: entry
> > ns8250_probe::uart_getreg REG_IIR = 193
> > ns8250_probe::uart_getreg REG_MCR = 8
> > ns8250_bus_probe:: exit
> > 
> > For the two devices that fail, ns8250_bus_probe() fails on the first
> > call:
> > 
> > UART4
> > -----
> > ns8250_bus_probe:: entry
> > ns8250_probe::uart_getreg REG_IIR = 1
> > ns8250_probe::uart_getreg REG_MCR = 64
> > ns8250_bus_probe::ns8250_probe returned 6
> > 
> > UART5
> > -----
> > ns8250_bus_probe:: entry
> > ns8250_probe::uart_getreg REG_IIR = 1
> > ns8250_probe::uart_getreg REG_MCR = 64
> > ns8250_bus_probe::ns8250_probe returned 6
> > 
> > The value returned for the read of REG_MCR is 64, or 0x40, which causes
> > the premature exit:
> > 
> > static int
> > ns8250_probe(struct uart_bas *bas)
> > {
> > 	u_char val;
> > 
> > 	/* Check known 0 bits that don't depend on DLAB. */
> > 	val = uart_getreg(bas, REG_IIR);
> > 	if (val & 0x30)
> > 		return (ENXIO);
> > 	val = uart_getreg(bas, REG_MCR);
> > 	if (val & 0xe0)
> > 		return (ENXIO);
> > 
> > 	return (0);
> > }
> > 
> > Do you need to know the contents of 'bas'?
> 
> This goes beyond my level of knowledge.  I've cc'd Marcel (author of uart) who 
> can hopefully help with this more.

Thank you for all your help.  I now have all four ports working, but a
few things still need sorting out.  I'll see if Marcel can help me.

Best wishes.


Cheers,
       Nick.
-- 



More information about the freebsd-hardware mailing list