[PATCH] Make the Startech UART detection 'more correct'.

From: Tom Rini
Date: Mon Sep 08 2003 - 15:55:53 EST


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.

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 Fri Sep 5 15:44:11 2003
@@ -3740,7 +3740,7 @@
if (state->type == PORT_16550A) {
/* Check for Startech UART's */
serial_outp(info, UART_LCR, UART_LCR_DLAB);
- if (serial_in(info, UART_EFR) == 0) {
+ if (serial_in(info, UART_EFR) == 0 && size_fifo(info) != 16) {
state->type = PORT_16650;
} else {
serial_outp(info, UART_LCR, 0xBF);

2.6:
===== drivers/serial/8250.c 1.34 vs edited =====
--- 1.34/drivers/serial/8250.c Sun Jun 15 02:21:11 2003
+++ edited/drivers/serial/8250.c Fri Sep 5 15:43:23 2003
@@ -467,7 +467,7 @@
* Only ST16C650V1 UARTs pass this test.
*/
serial_outp(up, UART_LCR, UART_LCR_DLAB);
- if (serial_in(up, UART_EFR) == 0) {
+ if (serial_in(up, UART_EFR) == 0 && size_fifo(up) != 16) {
DEBUG_AUTOCONF("EFRv1 ");
up->port.type = PORT_16650;
return;

I must admit however, that after reading both datasheets, I'm not sure
if the correct test is for && size_fifo() == 32 or != 16, or if it
matters. Comments?

This was originally fixed by Greg Allen[3].

[1]: http://www.exar.com/products/uartnote.pdf
[2]: http://e-www.motorola.com/brdata/PDFDB/docs/MPC8245UM_CH12.pdf
[3]: http://www.geocrawler.com/archives/3/8358/2002/3/0/8228902/
--
Tom Rini
http://gate.crashing.org/~trini/

Attachment: pgp00001.pgp
Description: PGP signature