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>