/* * The UART Tx interrupts are not set under some conditions and therefore serial * transmission hangs. This is a silicon issue and has not been root caused. The * workaround for this silicon issue checks UART_LSR_THRE bit and UART_LSR_TEMT * bit of LSR register in interrupt handler to see whether at least one of these * two bits is set, if so then process the transmit request. If this workaround * is not applied, then the serial transmission may hang. This workaround is for * errata number 9 in Errata - B step.
*/ static u32 ce4100_mem_serial_in(struct uart_port *p, unsignedint offset)
{
u32 ret, ier, lsr;
ret = mem_serial_in(p, offset); if (offset != UART_IIR || !(ret & UART_IIR_NO_INT)) return ret;
/* see if the TX interrupt should have really set */
ier = mem_serial_in(p, UART_IER); /* see if the UART's XMIT interrupt is enabled */ if (!(ier & UART_IER_THRI)) return ret;
lsr = mem_serial_in(p, UART_LSR); /* now check to see if the UART should be generating an interrupt (but isn't) */ if (lsr & (UART_LSR_THRE | UART_LSR_TEMT))
ret &= ~UART_IIR_NO_INT;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.