cpm_uart non-console problem with write on 2nd open..
Alexandros Kostopoulos
akostop at inaccessnetworks.com
Thu Sep 14 23:30:44 EST 2006
I'm experiencing a problem with the 2.6.13 cpm_uart driver. When opening
the device for the second time after the driver was inserted, if only a
few bytes are sent for transmission and the device is then closed, the
tx_empty routine called by shutdown returns 0 and the latter hangs in the
while loop with the call to cpm_uart_tx_empty. No bytes are actually
transmitted from the uart.
I found out that the difference between the first and subsequent open
calls is that during the first time (and until the first shutdown) the
transmitter is enabled in GSMRL. From this point on, the transmitter is
initially disabled on startup. Thus, if only a few bytes are queued for
transmission before shutdown and a TX interrupt is not triggered, the
bytes are never sent, and thus the shutdown function hangs on the
cpm_uart_tx_empty loop.
The fix that works for me is the following:
Index: drivers/serial/cpm_uart/cpm_uart_core.c
===================================================================
--- drivers/serial/cpm_uart/cpm_uart_core.c (revision 106)
+++ drivers/serial/cpm_uart/cpm_uart_core.c (working copy)
@@ -394,7 +394,7 @@ static int cpm_uart_startup(struct uart_
pinfo->smcp->smc_smcmr |= SMCMR_REN;
} else {
pinfo->sccp->scc_sccm |= UART_SCCM_RX;
- pinfo->sccp->scc_gsmrl |= (SCC_GSMRL_ENR);
+ pinfo->sccp->scc_gsmrl |= (SCC_GSMRL_ENR | SCC_GSMRL_ENT);
}
Any comments would be greatly appreciated
thank you
Alex
More information about the Linuxppc-dev
mailing list