From 15f3a91858fc54e3c006fb07a0b87b9610a01f28 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 10 Jun 2013 14:11:07 +0200 Subject: libchip: Use Termios API change for NS16550 This avoids a race condition on SMP configurations. --- c/src/libchip/serial/ns16550.c | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) (limited to 'c/src/libchip') diff --git a/c/src/libchip/serial/ns16550.c b/c/src/libchip/serial/ns16550.c index 5ef0f97d27..bf5b1b1359 100644 --- a/c/src/libchip/serial/ns16550.c +++ b/c/src/libchip/serial/ns16550.c @@ -550,19 +550,12 @@ NS16550_STATIC void ns16550_process( int minor) /* Check if we can dequeue transmitted characters */ if (ctx->transmitFifoChars > 0 && (get( port, NS16550_LINE_STATUS) & SP_LSR_THOLD) != 0) { - unsigned chars = ctx->transmitFifoChars; - - /* - * We finished the transmission, so clear the number of characters in the - * transmit FIFO. - */ - ctx->transmitFifoChars = 0; /* Dequeue transmitted characters */ - if (rtems_termios_dequeue_characters( d->termios_data, chars) == 0) { - /* Nothing to do */ - ns16550_enable_interrupts( c, NS16550_ENABLE_ALL_INTR_EXCEPT_TX); - } + rtems_termios_dequeue_characters( + d->termios_data, + ctx->transmitFifoChars + ); } } while ((get( port, NS16550_INTERRUPT_ID) & SP_IID_0) == 0); } @@ -595,9 +588,12 @@ ssize_t ns16550_write_support_int( set( port, NS16550_TRANSMIT_BUFFER, buf [i]); } - if (len > 0) { - ctx->transmitFifoChars = out; + ctx->transmitFifoChars = out; + + if (out > 0) { ns16550_enable_interrupts( c, NS16550_ENABLE_ALL_INTR); + } else { + ns16550_enable_interrupts( c, NS16550_ENABLE_ALL_INTR_EXCEPT_TX); } return 0; -- cgit v1.2.3