[rtems commit] termios: Notify driver about inactive transmit

Sebastian Huber sebh at rtems.org
Wed Jun 12 14:08:10 UTC 2013


Module:    rtems
Branch:    master
Commit:    fed92f5f67bcaeffa6cb6ceebf5ddfdbcaff7fb8
Changeset: http://git.rtems.org/rtems/commit/?id=fed92f5f67bcaeffa6cb6ceebf5ddfdbcaff7fb8

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Mon Jun 10 14:36:44 2013 +0200

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(+), 0 deletions(-)

diff --git a/cpukit/libcsupport/src/termios.c b/cpukit/libcsupport/src/termios.c
index 5c48915..1c87e6b 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 f04a67f..555cf04 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




More information about the vc mailing list