Date: Wed, 25 May 2011 09:46:45 -0400 From: John Baldwin <jhb@freebsd.org> To: "N.J. Mann" <njm@njm.me.uk> Cc: Marcel Moolenaar <marcel@freebsd.org>, freebsd-hardware@freebsd.org Subject: Re: Sunix 4056A PCI 4 port RS-232 card - only 2 ports configured Message-ID: <201105250946.45653.jhb@freebsd.org> In-Reply-To: <20110524215232.GB92553@titania.njm.me.uk> References: <20110522110002.GB91694@titania.njm.me.uk> <201105241610.49930.jhb@freebsd.org> <20110524215232.GB92553@titania.njm.me.uk>
index | next in thread | previous in thread | raw e-mail
On Tuesday, May 24, 2011 5:52:32 pm N.J. Mann wrote:
> In message <201105241610.49930.jhb@freebsd.org>,
> John Baldwin (jhb@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.
--
John Baldwin
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201105250946.45653.jhb>
