summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2013-06-10 14:36:44 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2013-06-12 16:11:25 +0200
commitfed92f5f67bcaeffa6cb6ceebf5ddfdbcaff7fb8 (patch)
treebb3edf6e2c9d1856a1a5fbecdb10a6b8e5893dbd
parenttermios: Expand critical section (diff)
downloadrtems-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.
Diffstat (limited to '')
-rw-r--r--cpukit/libcsupport/src/termios.c3
-rw-r--r--doc/bsp_howto/console.t6
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