Messages in this thread Patches in this message | | | Date | Tue, 9 Sep 2003 16:51:53 -0700 | From | Tom Rini <> | Subject | Re: [PATCH] Make the Startech UART detection 'more correct'. |
| |
On Tue, Sep 09, 2003 at 05:18:59PM +0100, Russell King wrote:
> On Mon, Sep 08, 2003 at 01:54:31PM -0700, Tom Rini wrote: > > Hello. The following patches (vs 2.4 and 2.6) make the Startech UART > > detection 'more correct' The problem is that on with the Motorola > > MPC82xx line (8245 for example) it has an internal DUART that it claims > > to be PC16550D compatible, and it has an additional EFR (Enhanced > > Feature Register) at offset 0x2, like on the Startech UARTS. However, > > it is not a Startech, and when it's detected as such, FIFOs don't work. > > The fix for this is that the Startech UARTs have a 32 byte FIFO [1] and > > the MPC82xx DUARTs have a 16-byte FIFO [2], to check that the FIFO size > > is correct for a Startech. > > size_fifo() is claimed to be unreliable at detecting the FIFO size, > so I don't feel safe about using it here. > > I'd suggest something like: > > serial_outp(port, UART_LCR, UART_LCR_DLAB); > efr = serial_in(port, UART_EFR); > if ((efr & 0xfc) == 0) { > serial_out(port, UART_EFR, 0xac | (efr & 3)); > /* if top 6 bits return zero, its motorola */ > if (serial_in(port, UART_EFR) == (efr & 3)) { > /* motorola port */ > } else { > /* ST16C650V1 port */ > } > /* restore old value */ > serial_outb(port, UART_EFR, efr); > }
Okay, from Kumar Gala (cc'ed) I've got the following patch for 2.4: ===== drivers/char/serial.c 1.34 vs edited ===== --- 1.34/drivers/char/serial.c Sun Jul 6 22:33:28 2003 +++ edited/drivers/char/serial.c Tue Sep 9 16:50:22 2003 @@ -3741,7 +3741,10 @@ /* Check for Startech UART's */ serial_outp(info, UART_LCR, UART_LCR_DLAB); if (serial_in(info, UART_EFR) == 0) { - state->type = PORT_16650; + serial_outp(info, UART_EFR, 0xA8); + if (serial_in(info, UART_EFR) != 0) + state->type = PORT_16650; + serial_outp(info, UART_EFR, 0); } else { serial_outp(info, UART_LCR, 0xBF); if (serial_in(info, UART_EFR) == 0) And I forward ported this up to 2.6 as: ===== drivers/serial/8250.c 1.36 vs edited ===== --- 1.36/drivers/serial/8250.c Tue Sep 9 07:22:12 2003 +++ edited/drivers/serial/8250.c Tue Sep 9 16:49:07 2003 @@ -469,8 +469,13 @@ */ serial_outp(up, UART_LCR, UART_LCR_DLAB); if (serial_in(up, UART_EFR) == 0) { - DEBUG_AUTOCONF("EFRv1 "); - up->port.type = PORT_16650; + serial_outp(up, UART_EFR, 0xA8); + if (serial_in(up, UART_EFR) != 0) { + DEBUG_AUTOCONF("EFRv1 "); + up->port.type = PORT_16650; + } else + DEBUG_AUTOCONF("Motorola 8xxx DUART "); + serial_outp(up, UART_EFR, 0); return; }
Better? -- Tom Rini http://gate.crashing.org/~trini/ [unhandled content-type:application/pgp-signature] | |