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


More information about the Linuxppc-dev mailing list