From fed92f5f67bcaeffa6cb6ceebf5ddfdbcaff7fb8 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 10 Jun 2013 14:36:44 +0200 Subject: termios: Notify driver about inactive transmit Returning this state in the return value leads to race conditions on SMP. The inactive state notification must be inside the critical section. --- cpukit/libcsupport/src/termios.c | 3 +++ doc/bsp_howto/console.t | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/cpukit/libcsupport/src/termios.c b/cpukit/libcsupport/src/termios.c index 5c489152ee..1c87e6b2c6 100644 --- a/cpukit/libcsupport/src/termios.c +++ b/cpukit/libcsupport/src/termios.c @@ -1332,6 +1332,7 @@ rtems_termios_refill_transmitter (struct rtems_termios_tty *tty) wakeUpWriterTask = true; } + (*tty->device.write) (tty->minor, NULL, 0); nToSend = 0; } else { len = tty->t_dqlen; @@ -1351,6 +1352,7 @@ rtems_termios_refill_transmitter (struct rtems_termios_tty *tty) * Buffer has become empty */ tty->rawOutBufState = rob_idle; + (*tty->device.write) (tty->minor, NULL, 0); nToSend = 0; /* @@ -1367,6 +1369,7 @@ rtems_termios_refill_transmitter (struct rtems_termios_tty *tty) /* set flag, that output has been stopped */ tty->flow_ctrl |= FL_OSTOP; tty->rawOutBufState = rob_busy; /*apm*/ + (*tty->device.write) (tty->minor, NULL, 0); nToSend = 0; } else { /* diff --git a/doc/bsp_howto/console.t b/doc/bsp_howto/console.t index f04a67fcf1..555cf044fe 100644 --- a/doc/bsp_howto/console.t +++ b/doc/bsp_howto/console.t @@ -408,6 +408,12 @@ static ssize_t my_driver_interrupt_write(int minor, const char *buf, size_t n) * characters in the device data structure. */ + /* + * Termios will set n to zero to indicate that the transmitter is + * now inactive. The output buffer is empty in this case. The + * driver may disable the transmit interrupts now. + */ + return 0; @} @end group -- cgit v1.2.3