CPM2 (MPC8260) SMC problem. Please help.

Vitaly Bordug vbordug at ru.mvista.com
Tue Oct 24 03:23:10 EST 2006


[...]
> >>
> >> I think that should be walked along the cpm_uart driver, TX part  
> >> to see is sending stuff
> >> do not indicate any error in the CPM registers, or at least  
> >> discover exact track leading to the endless loop.
> >
> > HI. I'm new here, but I encounted a very similar problem late last  
> > week....
> >
> > Boris, I am willing to bet that your problem lies with the return
> > value from cpm_uart_tx_pump().  Here's the last few lines of that
> > function from 2.6.17 :
> > 693         if (uart_circ_empty(xmit)) {
> > 694                 cpm_uart_stop_tx(port);
> > 695                 return 0;
> > 696         }
> > 697
> > 698         return 1;
> > 699 }
> > Note that return value is 0 if there is no more data in the tty's
> > circular queue (uart_circ_empty() returns true)  This is the case when
> > you send a small packet.  It seems appropriate to turn off the
> > transmitter (cpm_uart_stop_tx()) in the general case, but the problem
> > is that you never turned on the transmitter in the first place.....you
> > called cpm_uart_tx_pump() from cpm_uart_start_tx() like so:
> > 195         if (cpm_uart_tx_pump(port) != 0) {
> > 196                 if (IS_SMC(pinfo)) {
> > 197                         smcp->smc_smcm |= SMCM_TX;
> > 198                         smcp->smc_smcmr |= SMCMR_TEN;
> > 199                 } else {
> > 200                         sccp->scc_sccm |= UART_SCCM_TX;
> > 201                         pinfo->sccp->scc_gsmrl |= SCC_GSMRL_ENT;
> > 202                 }
> > 203         }
> >
> > When you then attempt to close the port, you'll get stuck here, in
> > cpm_uart_shutdown():
> > 455                 /* Wait for all the BDs marked sent */
> > 456                 while(!cpm_uart_tx_empty(port)) {
> > 457                         set_current_state(TASK_UNINTERRUPTIBLE);
> > 458                         schedule_timeout(2);
> > 459                 }
> > Because the transmitter was never turned on, the bd will never be
> > processed by the CPM and cpm_uart_tx_empty() will always return false.
> >
> > Recommendation: Change the first block of code above to: "return
> > (count != 0);"  Now cpm_uart_tx_pump() will return true if data was
> > placed in a bd, instead of true when there is more data to be
> > processed later.  This code works for me - but there are folks on this
> > list who would have a better idea about possible side
> > effects........anyone?
> 
> Yes, sounds true.
> 
> Since I was responsible for that, hand me the brown paper bag...
> 
> /me wears it.
> 
> Please send me a patch to process it.
> 

Hey, not that rough :)

I used to add some bits and "cpm_uart_tx_empty() will always return false" is mine as well.

Greg: 
Patch/code snippet from working tree welcome, and I'll address it anyway since it looks like generic issue.

Thanks.
-- 
Sincerely, 
Vitaly



More information about the Linuxppc-embedded mailing list