diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-06-10 14:36:44 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-06-12 16:11:25 +0200 |
commit | fed92f5f67bcaeffa6cb6ceebf5ddfdbcaff7fb8 (patch) | |
tree | bb3edf6e2c9d1856a1a5fbecdb10a6b8e5893dbd | |
parent | termios: Expand critical section (diff) | |
download | rtems-fed92f5f67bcaeffa6cb6ceebf5ddfdbcaff7fb8.tar.bz2 |
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.
-rw-r--r-- | cpukit/libcsupport/src/termios.c | 3 | ||||
-rw-r--r-- | doc/bsp_howto/console.t | 6 |
2 files changed, 9 insertions, 0 deletions
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 |