Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 24 May 2011 22:52:32 +0100
From:      "N.J. Mann" <njm@njm.me.uk>
To:        John Baldwin <jhb@freebsd.org>
Cc:        freebsd-hardware@freebsd.org
Subject:   Re: Sunix 4056A PCI 4 port RS-232 card - only 2 ports configured
Message-ID:  <20110524215232.GB92553@titania.njm.me.uk>
In-Reply-To: <201105241610.49930.jhb@freebsd.org>
References:  <20110522110002.GB91694@titania.njm.me.uk> <201105241341.49546.jhb@freebsd.org> <20110524200100.GA92553@titania.njm.me.uk> <201105241610.49930.jhb@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
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'?

Many thanks.


Cheers,
       Nick
-- 




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20110524215232.GB92553>