[rtems commit] termios: Update due to API changes

Sebastian Huber sebh at rtems.org
Tue Jun 25 15:01:50 UTC 2013


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

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Mon Jun 24 17:29:11 2013 +0200

termios: Update due to API changes

Termios notifies now the driver about an inactive transmit with the
length argument set to zero.

---

 c/src/lib/libbsp/arm/csb336/console/uart.c         |   10 ++-
 c/src/lib/libbsp/arm/shared/comm/uart.c            |    4 -
 .../libbsp/lm32/shared/milkymist_console/console.c |    7 +-
 c/src/lib/libbsp/m68k/av5282/console/console.c     |   17 ++---
 c/src/lib/libbsp/m68k/gen68340/console/console.c   |   12 +++-
 c/src/lib/libbsp/m68k/gen68360/console/console.c   |    9 ++-
 c/src/lib/libbsp/m68k/genmcf548x/console/console.c |   17 ++---
 c/src/lib/libbsp/m68k/mcf52235/console/console.c   |   17 ++---
 c/src/lib/libbsp/m68k/mcf5225x/console/console.c   |   17 ++---
 c/src/lib/libbsp/m68k/mcf5235/console/console.c    |   17 ++---
 c/src/lib/libbsp/m68k/mcf5329/console/console.c    |   17 ++---
 c/src/lib/libbsp/m68k/mvme167/console/console.c    |   62 ++++++++++----------
 c/src/lib/libbsp/m68k/uC5282/console/console.c     |   17 ++---
 c/src/lib/libbsp/powerpc/gen5200/console/console.c |   40 +++++++------
 .../powerpc/qoriq/console/uart-bridge-slave.c      |   44 +++++++-------
 c/src/lib/libbsp/powerpc/shared/console/uart.c     |    3 -
 c/src/lib/libbsp/powerpc/tqm8xx/console/console.c  |   37 ++++++-----
 .../lib/libbsp/sparc/erc32/console/erc32_console.c |   36 ++++++------
 c/src/lib/libbsp/sparc/leon3/console/console.c     |   29 ++++-----
 c/src/lib/libcpu/bfin/serial/uart.c                |   17 ++----
 c/src/lib/libcpu/m68k/mcf5206/console/mcfuart.c    |   23 ++++----
 c/src/lib/libcpu/mips/mongoosev/duart/mg5uart.c    |    4 -
 c/src/lib/libcpu/powerpc/mpc55xx/esci/esci.c       |   11 ++--
 .../mpc5xx/console-generic/console-generic.c       |    9 ++-
 .../mpc8260/console-generic/console-generic.c      |   13 +++--
 c/src/lib/libcpu/powerpc/ppc403/console/console.c  |    7 ++-
 .../lib/libcpu/powerpc/ppc403/console/console405.c |    7 ++-
 c/src/lib/libcpu/sh/sh7750/sci/sh4uart.c           |   27 ++++-----
 28 files changed, 257 insertions(+), 273 deletions(-)

diff --git a/c/src/lib/libbsp/arm/csb336/console/uart.c b/c/src/lib/libbsp/arm/csb336/console/uart.c
index 4dc409b..4c64832 100644
--- a/c/src/lib/libbsp/arm/csb336/console/uart.c
+++ b/c/src/lib/libbsp/arm/csb336/console/uart.c
@@ -294,11 +294,13 @@ static ssize_t imx_uart_poll_write(int minor, const char *buf, size_t len)
 #if defined(USE_INTERRUPTS)
 static ssize_t imx_uart_intr_write(int minor, const char *buf, size_t len)
 {
-    imx_uart_data[minor].buf = buf;
-    imx_uart_data[minor].len = len;
-    imx_uart_data[minor].idx = 0;
+    if (len > 0) {
+        imx_uart_data[minor].buf = buf;
+        imx_uart_data[minor].len = len;
+        imx_uart_data[minor].idx = 0;
 
-    imx_uart_data[minor].regs->cr1 |= MC9328MXL_UART_CR1_TXMPTYEN;
+        imx_uart_data[minor].regs->cr1 |= MC9328MXL_UART_CR1_TXMPTYEN;
+    }
 
     return 1;
 }
diff --git a/c/src/lib/libbsp/arm/shared/comm/uart.c b/c/src/lib/libbsp/arm/shared/comm/uart.c
index 6015e0d..390a07d 100644
--- a/c/src/lib/libbsp/arm/shared/comm/uart.c
+++ b/c/src/lib/libbsp/arm/shared/comm/uart.c
@@ -371,8 +371,6 @@ BSP_uart_termios_set(int uart, void *ttyp)
 int
 BSP_uart_termios_write_com1(int minor, const char *buf, int len)
 {
-  assert(buf != NULL);
-
   if(len <= 0)
     {
       return 0;
@@ -410,8 +408,6 @@ BSP_uart_termios_write_com1(int minor, const char *buf, int len)
 int
 BSP_uart_termios_write_com2(int minor, const char *buf, int len)
 {
-  assert(buf != NULL);
-
   if(len <= 0)
     {
       return 0;
diff --git a/c/src/lib/libbsp/lm32/shared/milkymist_console/console.c b/c/src/lib/libbsp/lm32/shared/milkymist_console/console.c
index 1abde5f..a7c3a29 100644
--- a/c/src/lib/libbsp/lm32/shared/milkymist_console/console.c
+++ b/c/src/lib/libbsp/lm32/shared/milkymist_console/console.c
@@ -114,11 +114,10 @@ static int mmconsole_set_attributes(int minor, const struct termios *t)
 
 static ssize_t mmconsole_write(int minor, const char *buf, size_t n)
 {
-  rtems_interrupt_level level;
+  if (n > 0) {
+    MM_WRITE(MM_UART_RXTX, *buf);
+  }
 
-  rtems_interrupt_disable(level);
-  MM_WRITE(MM_UART_RXTX, *buf);
-  rtems_interrupt_enable(level);
   return 0;
 }
 
diff --git a/c/src/lib/libbsp/m68k/av5282/console/console.c b/c/src/lib/libbsp/m68k/av5282/console/console.c
index 25f0122..85ec37f 100644
--- a/c/src/lib/libbsp/m68k/av5282/console/console.c
+++ b/c/src/lib/libbsp/m68k/av5282/console/console.c
@@ -382,18 +382,15 @@ static ssize_t IntUartInterruptWrite(
   size_t      len
 )
 {
-  rtems_interrupt_level     level;
-
-  rtems_interrupt_disable(level);
+  if (len > 0) {
+    /* write out character */
+    MCF5282_UART_UTB(minor) = *buf;
 
-  /* write out character */
-  MCF5282_UART_UTB(minor) = *buf;
-
-  /* enable tx interrupt */
-  IntUartInfo[minor].uimr |= MCF5282_UART_UIMR_TXRDY;
-  MCF5282_UART_UIMR(minor) = IntUartInfo[minor].uimr;
+    /* enable tx interrupt */
+    IntUartInfo[minor].uimr |= MCF5282_UART_UIMR_TXRDY;
+    MCF5282_UART_UIMR(minor) = IntUartInfo[minor].uimr;
+  }
 
-  rtems_interrupt_enable(level);
   return 0;
 }
 
diff --git a/c/src/lib/libbsp/m68k/gen68340/console/console.c b/c/src/lib/libbsp/m68k/gen68340/console/console.c
index 17d4ef4..d1fa02e 100644
--- a/c/src/lib/libbsp/m68k/gen68340/console/console.c
+++ b/c/src/lib/libbsp/m68k/gen68340/console/console.c
@@ -172,12 +172,16 @@ static ssize_t
 InterruptWrite (int minor, const char *buf, size_t len)
 {
  if (minor==UART_CHANNEL_A) {
-    if (len>0) DUTBA=*buf;
-    Enable_Interrupts_Tx_A;
+    if (len>0) {
+      DUTBA=*buf;
+      Enable_Interrupts_Tx_A;
+    }
  }
  else if (minor==UART_CHANNEL_B) {
-    if (len>0) DUTBB=*buf;
-    Enable_Interrupts_Tx_B;
+    if (len>0) {
+      DUTBB=*buf;
+      Enable_Interrupts_Tx_B;
+    }
  }
  return 0;
 }
diff --git a/c/src/lib/libbsp/m68k/gen68360/console/console.c b/c/src/lib/libbsp/m68k/gen68360/console/console.c
index 0c43317..8233449 100644
--- a/c/src/lib/libbsp/m68k/gen68360/console/console.c
+++ b/c/src/lib/libbsp/m68k/gen68360/console/console.c
@@ -231,9 +231,12 @@ smc1PollRead (int minor)
 static ssize_t
 smc1InterruptWrite (int minor, const char *buf, size_t len)
 {
-	smcTxBd->buffer = (char *)buf;
-	smcTxBd->length = len;
-	smcTxBd->status = M360_BD_READY | M360_BD_WRAP | M360_BD_INTERRUPT;
+	if (len > 0) {
+		smcTxBd->buffer = (char *)buf;
+		smcTxBd->length = len;
+		smcTxBd->status = M360_BD_READY | M360_BD_WRAP | M360_BD_INTERRUPT;
+	}
+
 	return 0;
 }
 
diff --git a/c/src/lib/libbsp/m68k/genmcf548x/console/console.c b/c/src/lib/libbsp/m68k/genmcf548x/console/console.c
index af18e23..5e85e20 100644
--- a/c/src/lib/libbsp/m68k/genmcf548x/console/console.c
+++ b/c/src/lib/libbsp/m68k/genmcf548x/console/console.c
@@ -528,18 +528,15 @@ IntUartInitialize(void)
 static ssize_t
 IntUartInterruptWrite (int minor, const char *buf, size_t len)
 {
-	int level;
-
-	rtems_interrupt_disable(level);
+	if (len > 0) {
+		/* write out character */
+		*(volatile uint8_t *)(&MCF548X_PSC_TB(minor)) = *buf;
 
-	/* write out character */
-	*(volatile uint8_t *)(&MCF548X_PSC_TB(minor)) = *buf;
-
-	/* enable tx interrupt */
-	IntUartInfo[minor].imr |= MCF548X_PSC_IMR_TXRDY;
-	MCF548X_PSC_IMR(minor) = IntUartInfo[minor].imr;
+		/* enable tx interrupt */
+		IntUartInfo[minor].imr |= MCF548X_PSC_IMR_TXRDY;
+		MCF548X_PSC_IMR(minor) = IntUartInfo[minor].imr;
+	}
 
-	rtems_interrupt_enable(level);
 	return 0;
 }
 
diff --git a/c/src/lib/libbsp/m68k/mcf52235/console/console.c b/c/src/lib/libbsp/m68k/mcf52235/console/console.c
index b0ac4f9..0b508c5 100644
--- a/c/src/lib/libbsp/m68k/mcf52235/console/console.c
+++ b/c/src/lib/libbsp/m68k/mcf52235/console/console.c
@@ -341,18 +341,15 @@ static void IntUartInitialize(void)
  ***************************************************************************/
 static ssize_t IntUartInterruptWrite(int minor, const char *buf, size_t len)
 {
-  int level;
-
-  rtems_interrupt_disable(level);
+  if (len > 0) {
+    /* write out character */
+    MCF_UART_UTB(minor) = *buf;
 
-  /* write out character */
-  MCF_UART_UTB(minor) = *buf;
-
-  /* enable tx interrupt */
-  IntUartInfo[minor].uimr |= MCF_UART_UIMR_TXRDY;
-  MCF_UART_UIMR(minor) = IntUartInfo[minor].uimr;
+    /* enable tx interrupt */
+    IntUartInfo[minor].uimr |= MCF_UART_UIMR_TXRDY;
+    MCF_UART_UIMR(minor) = IntUartInfo[minor].uimr;
+  }
 
-  rtems_interrupt_enable(level);
   return (0);
 }
 
diff --git a/c/src/lib/libbsp/m68k/mcf5225x/console/console.c b/c/src/lib/libbsp/m68k/mcf5225x/console/console.c
index 1f81e40..48fca9f 100644
--- a/c/src/lib/libbsp/m68k/mcf5225x/console/console.c
+++ b/c/src/lib/libbsp/m68k/mcf5225x/console/console.c
@@ -366,18 +366,15 @@ static void IntUartInitialize(void)
  ***************************************************************************/
 static ssize_t IntUartInterruptWrite(int minor, const char *buf, size_t len)
 {
-  rtems_interrupt_level level=UART0_IRQ_LEVEL;
-
-  rtems_interrupt_disable(level);
+  if (len > 0) {
+    /* write out character */
+    MCF_UART_UTB(minor) = *buf;
 
-  /* write out character */
-  MCF_UART_UTB(minor) = *buf;
-
-  /* enable tx interrupt */
-  IntUartInfo[minor].uimr |= MCF_UART_UIMR_TXRDY;
-  MCF_UART_UIMR(minor) = IntUartInfo[minor].uimr;
+    /* enable tx interrupt */
+    IntUartInfo[minor].uimr |= MCF_UART_UIMR_TXRDY;
+    MCF_UART_UIMR(minor) = IntUartInfo[minor].uimr;
+  }
 
-  rtems_interrupt_enable(level);
   return (0);
 }
 
diff --git a/c/src/lib/libbsp/m68k/mcf5235/console/console.c b/c/src/lib/libbsp/m68k/mcf5235/console/console.c
index 5c00adf..d0e556c 100644
--- a/c/src/lib/libbsp/m68k/mcf5235/console/console.c
+++ b/c/src/lib/libbsp/m68k/mcf5235/console/console.c
@@ -394,18 +394,15 @@ IntUartInitialize(void)
 static ssize_t
 IntUartInterruptWrite (int minor, const char *buf, size_t len)
 {
-	int level;
-
-	rtems_interrupt_disable(level);
+	if (len > 0) {
+		/* write out character */
+		MCF5235_UART_UTB(minor) = *buf;
 
-	/* write out character */
-	MCF5235_UART_UTB(minor) = *buf;
-
-	/* enable tx interrupt */
-	IntUartInfo[minor].uimr |= MCF5235_UART_UIMR_TXRDY;
-	MCF5235_UART_UIMR(minor) = IntUartInfo[minor].uimr;
+		/* enable tx interrupt */
+		IntUartInfo[minor].uimr |= MCF5235_UART_UIMR_TXRDY;
+		MCF5235_UART_UIMR(minor) = IntUartInfo[minor].uimr;
+	}
 
-	rtems_interrupt_enable(level);
 	return( 0 );
 }
 
diff --git a/c/src/lib/libbsp/m68k/mcf5329/console/console.c b/c/src/lib/libbsp/m68k/mcf5329/console/console.c
index f0c7980..8f72270 100644
--- a/c/src/lib/libbsp/m68k/mcf5329/console/console.c
+++ b/c/src/lib/libbsp/m68k/mcf5329/console/console.c
@@ -356,18 +356,15 @@ static void IntUartInitialize(void)
  ***************************************************************************/
 static ssize_t IntUartInterruptWrite(int minor, const char *buf, size_t len)
 {
-  int level;
-
-  rtems_interrupt_disable(level);
+  if (len > 0) {
+    /* write out character */
+    MCF_UART_UTB(minor) = *buf;
 
-  /* write out character */
-  MCF_UART_UTB(minor) = *buf;
-
-  /* enable tx interrupt */
-  IntUartInfo[minor].uimr |= MCF_UART_UIMR_TXRDY;
-  MCF_UART_UIMR(minor) = IntUartInfo[minor].uimr;
+    /* enable tx interrupt */
+    IntUartInfo[minor].uimr |= MCF_UART_UIMR_TXRDY;
+    MCF_UART_UIMR(minor) = IntUartInfo[minor].uimr;
+  }
 
-  rtems_interrupt_enable(level);
   return (0);
 }
 
diff --git a/c/src/lib/libbsp/m68k/mvme167/console/console.c b/c/src/lib/libbsp/m68k/mvme167/console/console.c
index a03eda8..ca16631 100644
--- a/c/src/lib/libbsp/m68k/mvme167/console/console.c
+++ b/c/src/lib/libbsp/m68k/mvme167/console/console.c
@@ -1141,37 +1141,39 @@ ssize_t cd2401_write(
   size_t len
 )
 {
-  cd2401->car = minor;              /* Select channel */
-
-  if ( (cd2401->dmabsts & 0x08) == 0 ) {
-    /* Next buffer is A. Wait for it to be ours. */
-    while ( cd2401->atbsts & 0x01 );
-
-    CD2401_Channel_Info[minor].own_buf_A = FALSE;
-    CD2401_Channel_Info[minor].len = len;
-    CD2401_Channel_Info[minor].buf = buf;
-    cd2401->atbadru = (uint16_t)( ( (uint32_t) buf ) >> 16 );
-    cd2401->atbadrl = (uint16_t)( (uint32_t) buf );
-    cd2401->atbcnt = len;
-    CD2401_RECORD_WRITE_INFO(( len, buf, 'A' ));
-    cd2401->atbsts = 0x03;          /* CD2401 owns buffer, int when empty */
-  }
-  else {
-    /* Next buffer is B. Wait for it to be ours. */
-    while ( cd2401->btbsts & 0x01 );
-
-    CD2401_Channel_Info[minor].own_buf_B = FALSE;
-    CD2401_Channel_Info[minor].len = len;
-    CD2401_Channel_Info[minor].buf = buf;
-    cd2401->btbadru = (uint16_t)( ( (uint32_t) buf ) >> 16 );
-    cd2401->btbadrl = (uint16_t)( (uint32_t) buf );
-    cd2401->btbcnt = len;
-    CD2401_RECORD_WRITE_INFO(( len, buf, 'B' ));
-    cd2401->btbsts = 0x03;          /* CD2401 owns buffer, int when empty */
+  if (len > 0) {
+    cd2401->car = minor;              /* Select channel */
+
+    if ( (cd2401->dmabsts & 0x08) == 0 ) {
+      /* Next buffer is A. Wait for it to be ours. */
+      while ( cd2401->atbsts & 0x01 );
+
+      CD2401_Channel_Info[minor].own_buf_A = FALSE;
+      CD2401_Channel_Info[minor].len = len;
+      CD2401_Channel_Info[minor].buf = buf;
+      cd2401->atbadru = (uint16_t)( ( (uint32_t) buf ) >> 16 );
+      cd2401->atbadrl = (uint16_t)( (uint32_t) buf );
+      cd2401->atbcnt = len;
+      CD2401_RECORD_WRITE_INFO(( len, buf, 'A' ));
+      cd2401->atbsts = 0x03;          /* CD2401 owns buffer, int when empty */
+    }
+    else {
+      /* Next buffer is B. Wait for it to be ours. */
+      while ( cd2401->btbsts & 0x01 );
+
+      CD2401_Channel_Info[minor].own_buf_B = FALSE;
+      CD2401_Channel_Info[minor].len = len;
+      CD2401_Channel_Info[minor].buf = buf;
+      cd2401->btbadru = (uint16_t)( ( (uint32_t) buf ) >> 16 );
+      cd2401->btbadrl = (uint16_t)( (uint32_t) buf );
+      cd2401->btbcnt = len;
+      CD2401_RECORD_WRITE_INFO(( len, buf, 'B' ));
+      cd2401->btbsts = 0x03;          /* CD2401 owns buffer, int when empty */
+    }
+    /* Nuts -- Need TxD ints */
+    CD2401_Channel_Info[minor].txEmpty = FALSE;
+    cd2401->ier |= 0x01;
   }
-  /* Nuts -- Need TxD ints */
-  CD2401_Channel_Info[minor].txEmpty = FALSE;
-  cd2401->ier |= 0x01;
 
   /* Return something */
   return len;
diff --git a/c/src/lib/libbsp/m68k/uC5282/console/console.c b/c/src/lib/libbsp/m68k/uC5282/console/console.c
index a213cbc..2c133d7 100644
--- a/c/src/lib/libbsp/m68k/uC5282/console/console.c
+++ b/c/src/lib/libbsp/m68k/uC5282/console/console.c
@@ -409,18 +409,15 @@ IntUartInitialize(void)
 static ssize_t
 IntUartInterruptWrite (int minor, const char *buf, size_t len)
 {
-	int level;
-
-	rtems_interrupt_disable(level);
+	if (len > 0) {
+		/* write out character */
+		MCF5282_UART_UTB(minor) = *buf;
 
-	/* write out character */
-	MCF5282_UART_UTB(minor) = *buf;
-
-	/* enable tx interrupt */
-	IntUartInfo[minor].uimr |= MCF5282_UART_UIMR_TXRDY;
-	MCF5282_UART_UIMR(minor) = IntUartInfo[minor].uimr;
+		/* enable tx interrupt */
+		IntUartInfo[minor].uimr |= MCF5282_UART_UIMR_TXRDY;
+		MCF5282_UART_UIMR(minor) = IntUartInfo[minor].uimr;
+	}
 
-	rtems_interrupt_enable(level);
 	return 0;
 }
 
diff --git a/c/src/lib/libbsp/powerpc/gen5200/console/console.c b/c/src/lib/libbsp/powerpc/gen5200/console/console.c
index 93a3ab7..a70e06d 100644
--- a/c/src/lib/libbsp/powerpc/gen5200/console/console.c
+++ b/c/src/lib/libbsp/powerpc/gen5200/console/console.c
@@ -581,33 +581,35 @@ ssize_t mpc5200_uart_write(
   size_t len
 )
 {
-  int frame_len = len;
-  const char *frame_buf = buf;
-  struct mpc5200_psc *psc =
-    (struct mpc5200_psc *)(&mpc5200.psc[psc_minor_to_regset[minor]]);
+  if (len > 0) {
+    int frame_len = len;
+    const char *frame_buf = buf;
+    struct mpc5200_psc *psc =
+      (struct mpc5200_psc *)(&mpc5200.psc[psc_minor_to_regset[minor]]);
 
- /*
-  * Check tx fifo space
-  */
-  if(len > (TX_FIFO_SIZE - psc->tfnum))
-    frame_len = TX_FIFO_SIZE - psc->tfnum;
+   /*
+    * Check tx fifo space
+    */
+    if(len > (TX_FIFO_SIZE - psc->tfnum))
+      frame_len = TX_FIFO_SIZE - psc->tfnum;
 
 #ifndef SINGLE_CHAR_MODE
-  channel_info[minor].cur_tx_len = frame_len;
+    channel_info[minor].cur_tx_len = frame_len;
 #else
-  frame_len = 1;
+    frame_len = 1;
 #endif
 
- /*rtems_cache_flush_multiple_data_lines( (void *)frame_buf, frame_len);*/
+   /*rtems_cache_flush_multiple_data_lines( (void *)frame_buf, frame_len);*/
 
-  while (frame_len--)
-    /* perform byte write to avoid extra NUL characters */
-    (* (volatile char *)&(psc->rb_tb)) = *frame_buf++;
+    while (frame_len--)
+      /* perform byte write to avoid extra NUL characters */
+      (* (volatile char *)&(psc->rb_tb)) = *frame_buf++;
 
- /*
-  * unmask interrupt
-  */
-  psc->isr_imr = channel_info[minor].shadow_imr |= IMR_TX_RDY;
+   /*
+    * unmask interrupt
+    */
+    psc->isr_imr = channel_info[minor].shadow_imr |= IMR_TX_RDY;
+  }
 
   return 0;
 }
diff --git a/c/src/lib/libbsp/powerpc/qoriq/console/uart-bridge-slave.c b/c/src/lib/libbsp/powerpc/qoriq/console/uart-bridge-slave.c
index 86f5de8..5fc0b95 100644
--- a/c/src/lib/libbsp/powerpc/qoriq/console/uart-bridge-slave.c
+++ b/c/src/lib/libbsp/powerpc/qoriq/console/uart-bridge-slave.c
@@ -153,28 +153,30 @@ static int last_close(int major, int minor, void *arg)
 
 static ssize_t write_with_interrupts(int minor, const char *buf, size_t len)
 {
-  rtems_status_code sc = RTEMS_SUCCESSFUL;
-  console_tbl *ct = Console_Port_Tbl[minor];
-  uart_bridge_slave_control *control = ct->pDeviceParams;
-  intercom_packet *packet = qoriq_intercom_allocate_packet(
-    control->type,
-    INTERCOM_SIZE_64
-  );
+  if (len > 0) {
+    rtems_status_code sc = RTEMS_SUCCESSFUL;
+    console_tbl *ct = Console_Port_Tbl[minor];
+    uart_bridge_slave_control *control = ct->pDeviceParams;
+    intercom_packet *packet = qoriq_intercom_allocate_packet(
+      control->type,
+      INTERCOM_SIZE_64
+    );
 
-  packet->size = len;
-  memcpy(packet->data, buf, len);
-
-  /*
-   * Due to the lovely Termios implementation we have to hand this over to
-   * another context.
-   */
-  sc = rtems_chain_append_with_notification(
-    &control->transmit_fifo,
-    &packet->glue.node,
-    control->transmit_task,
-    TRANSMIT_EVENT
-  );
-  assert(sc == RTEMS_SUCCESSFUL);
+    packet->size = len;
+    memcpy(packet->data, buf, len);
+
+    /*
+     * Due to the lovely Termios implementation we have to hand this over to
+     * another context.
+     */
+    sc = rtems_chain_append_with_notification(
+      &control->transmit_fifo,
+      &packet->glue.node,
+      control->transmit_task,
+      TRANSMIT_EVENT
+    );
+    assert(sc == RTEMS_SUCCESSFUL);
+  }
 
   return 0;
 }
diff --git a/c/src/lib/libbsp/powerpc/shared/console/uart.c b/c/src/lib/libbsp/powerpc/shared/console/uart.c
index 1079af1..67816e3 100644
--- a/c/src/lib/libbsp/powerpc/shared/console/uart.c
+++ b/c/src/lib/libbsp/powerpc/shared/console/uart.c
@@ -559,8 +559,6 @@ BSP_uart_termios_write_polled(int minor, const char *buf, size_t len)
   int nwrite;
   const char *b = buf;
 
-  assert(buf != NULL);
-
   for (nwrite=0 ; nwrite < len ; nwrite++) {
     BSP_uart_polled_write(uart, *b++);
   }
@@ -571,7 +569,6 @@ ssize_t
 BSP_uart_termios_write_com(int minor, const char *buf, size_t len)
 {
   int uart=minor;	/* could differ, theoretically */
-  assert(buf != NULL);
 
   if(len <= 0)
     {
diff --git a/c/src/lib/libbsp/powerpc/tqm8xx/console/console.c b/c/src/lib/libbsp/powerpc/tqm8xx/console/console.c
index 312bed2..b289878 100644
--- a/c/src/lib/libbsp/powerpc/tqm8xx/console/console.c
+++ b/c/src/lib/libbsp/powerpc/tqm8xx/console/console.c
@@ -778,26 +778,29 @@ sccPollRead (int minor)
 static ssize_t
 sccInterruptWrite (int minor, const char *buf, size_t len)
 {
-  int chan = minor;
+  if (len > 0) {
+    int chan = minor;
 
-  if ((sccPrepTxBd[chan]->status & M8xx_BD_READY) == 0) {
-    sccPrepTxBd[chan]->buffer = (char *)buf;
-    sccPrepTxBd[chan]->length = len;
-    rtems_cache_flush_multiple_data_lines((const void *)buf,len);
-    /*
-     * clear status, set ready bit
-     */
-    sccPrepTxBd[chan]->status =
-      (sccPrepTxBd[chan]->status
-       & M8xx_BD_WRAP)
-      | M8xx_BD_READY | M8xx_BD_INTERRUPT;
-    if ((sccPrepTxBd[chan]->status & M8xx_BD_WRAP) != 0) {
-      sccPrepTxBd[chan] = sccFrstTxBd[chan];
-    }
-    else {
-      sccPrepTxBd[chan]++;
+    if ((sccPrepTxBd[chan]->status & M8xx_BD_READY) == 0) {
+      sccPrepTxBd[chan]->buffer = (char *)buf;
+      sccPrepTxBd[chan]->length = len;
+      rtems_cache_flush_multiple_data_lines((const void *)buf,len);
+      /*
+       * clear status, set ready bit
+       */
+      sccPrepTxBd[chan]->status =
+        (sccPrepTxBd[chan]->status
+         & M8xx_BD_WRAP)
+        | M8xx_BD_READY | M8xx_BD_INTERRUPT;
+      if ((sccPrepTxBd[chan]->status & M8xx_BD_WRAP) != 0) {
+        sccPrepTxBd[chan] = sccFrstTxBd[chan];
+      }
+      else {
+        sccPrepTxBd[chan]++;
+      }
     }
   }
+
   return 0;
 }
 
diff --git a/c/src/lib/libbsp/sparc/erc32/console/erc32_console.c b/c/src/lib/libbsp/sparc/erc32/console/erc32_console.c
index 0860695..2acc72f 100644
--- a/c/src/lib/libbsp/sparc/erc32/console/erc32_console.c
+++ b/c/src/lib/libbsp/sparc/erc32/console/erc32_console.c
@@ -149,28 +149,28 @@ static int erc32_console_first_open(int major, int minor, void *arg)
 #if (CONSOLE_USE_INTERRUPTS)
 static ssize_t erc32_console_write_support_int(int minor, const char *buf, size_t len)
 {
-  console_data *cd = &Console_Port_Data[minor];
-  int k = 0;
+  if (len > 0) {
+    console_data *cd = &Console_Port_Data[minor];
+    int k = 0;
 
-  if (minor == 0) { /* uart a */
-    for (k = 0;
-         k < len && (ERC32_MEC.UART_Status & ERC32_MEC_UART_STATUS_THEA); k ++) {
-      ERC32_MEC.UART_Channel_A = (unsigned char)buf[k];
-    }
-    ERC32_Force_interrupt(ERC32_INTERRUPT_UART_A_RX_TX);
-  } else { /* uart b */
-    for (k = 0;
-         k < len && (ERC32_MEC.UART_Status & ERC32_MEC_UART_STATUS_THEB); k ++) {
-      ERC32_MEC.UART_Channel_B = (unsigned char)buf[k];
+    if (minor == 0) { /* uart a */
+      for (k = 0;
+           k < len && (ERC32_MEC.UART_Status & ERC32_MEC_UART_STATUS_THEA); k ++) {
+        ERC32_MEC.UART_Channel_A = (unsigned char)buf[k];
+      }
+      ERC32_Force_interrupt(ERC32_INTERRUPT_UART_A_RX_TX);
+    } else { /* uart b */
+      for (k = 0;
+           k < len && (ERC32_MEC.UART_Status & ERC32_MEC_UART_STATUS_THEB); k ++) {
+        ERC32_MEC.UART_Channel_B = (unsigned char)buf[k];
+      }
+      ERC32_Force_interrupt(ERC32_INTERRUPT_UART_B_RX_TX);
     }
-    ERC32_Force_interrupt(ERC32_INTERRUPT_UART_B_RX_TX);
-  }
-  
-  if (len > 0) {
+
     cd->pDeviceContext = (void *)k;
     cd->bActive = true;
   }
-  
+
   return 0;
 }
 
diff --git a/c/src/lib/libbsp/sparc/leon3/console/console.c b/c/src/lib/libbsp/sparc/leon3/console/console.c
index 3870685..566b058 100644
--- a/c/src/lib/libbsp/sparc/leon3/console/console.c
+++ b/c/src/lib/libbsp/sparc/leon3/console/console.c
@@ -117,27 +117,24 @@ void console_isr(void *arg)
  */
 int console_write_interrupt(int minor, const char *buf, int len)
 {
-  struct apbuart_priv *uart;
-  unsigned int oldLevel;
-
-  if (minor == 0)
-    uart = &apbuarts[syscon_uart_index];
-  else
-    uart = &apbuarts[minor - 1];
+  if (len > 0) {
+    struct apbuart_priv *uart;
 
-  /* Remember what position in buffer */
+    if (minor == 0)
+      uart = &apbuarts[syscon_uart_index];
+    else
+      uart = &apbuarts[minor - 1];
 
-  rtems_interrupt_disable(oldLevel);
+    /* Remember what position in buffer */
 
-  /* Enable TX interrupt */
-  uart->regs->ctrl |= LEON_REG_UART_CTRL_TI;
+    /* Enable TX interrupt */
+    uart->regs->ctrl |= LEON_REG_UART_CTRL_TI;
 
-  /* start UART TX, this will result in an interrupt when done */
-  uart->regs->data = *buf;
+    /* start UART TX, this will result in an interrupt when done */
+    uart->regs->data = *buf;
 
-  uart->sending = 1;
-
-  rtems_interrupt_enable(oldLevel);
+    uart->sending = 1;
+  }
 
   return 0;
 }
diff --git a/c/src/lib/libcpu/bfin/serial/uart.c b/c/src/lib/libcpu/bfin/serial/uart.c
index 36ea349..a264d9e 100644
--- a/c/src/lib/libcpu/bfin/serial/uart.c
+++ b/c/src/lib/libcpu/bfin/serial/uart.c
@@ -323,12 +323,14 @@ static int setAttributes(int minor, const struct termios *termios) {
 static ssize_t uart_interruptWrite(int minor, const char *buf, size_t len) {
   uint32_t              base      = 0;
   bfin_uart_channel_t*  channel   = NULL;
-  rtems_interrupt_level isrLevel;
 
   /**
    * Sanity Check
    */
-  if (NULL == buf || NULL == channel || NULL == uartsConfig || minor < 0) {
+  if (
+    NULL == buf || NULL == channel || NULL == uartsConfig
+      || minor < 0 || 0 == len
+  ) {
     return 0;
   }
 
@@ -338,8 +340,6 @@ static ssize_t uart_interruptWrite(int minor, const char *buf, size_t len) {
     return 0;
   }
 
-  rtems_interrupt_disable(isrLevel);
-
   base = channel->uart_baseAddress;
 
   channel->flags |= BFIN_UART_XMIT_BUSY;
@@ -347,8 +347,6 @@ static ssize_t uart_interruptWrite(int minor, const char *buf, size_t len) {
   *(uint16_t volatile *) (base + UART_THR_OFFSET) = *buf;
   *(uint16_t volatile *) (base + UART_IER_OFFSET) = UART_IER_ETBEI;
 
-  rtems_interrupt_enable(isrLevel);
-
   return 0;
 }
 
@@ -412,12 +410,11 @@ static ssize_t uart_DmaWrite(int minor, const char *buf, size_t len) {
   uint32_t              base        = 0;
   bfin_uart_channel_t*  channel     = NULL;
   uint32_t              tx_dma_base = 0;
-  rtems_interrupt_level isrLevel;
 
   /**
    * Sanity Check
    */
-  if ( NULL == buf || 0 > minor || NULL == uartsConfig ) {
+  if ( NULL == buf || 0 > minor || NULL == uartsConfig || 0 == len ) {
     return 0;
   }
 
@@ -430,8 +427,6 @@ static ssize_t uart_DmaWrite(int minor, const char *buf, size_t len) {
     return 0;
   }
 
-  rtems_interrupt_disable(isrLevel);
-
   base        = channel->uart_baseAddress;
   tx_dma_base = channel->uart_txDmaBaseAddress;
 
@@ -445,8 +440,6 @@ static ssize_t uart_DmaWrite(int minor, const char *buf, size_t len) {
   *(uint16_t volatile *) (tx_dma_base + DMA_CONFIG_OFFSET) |= DMA_CONFIG_DMAEN;
   *(uint16_t volatile *) (base + UART_IER_OFFSET) = UART_IER_ETBEI;
 
-  rtems_interrupt_enable(isrLevel);
-
   return 0;
 }
 
diff --git a/c/src/lib/libcpu/m68k/mcf5206/console/mcfuart.c b/c/src/lib/libcpu/m68k/mcf5206/console/mcfuart.c
index 27f2278..89468d1 100644
--- a/c/src/lib/libcpu/m68k/mcf5206/console/mcfuart.c
+++ b/c/src/lib/libcpu/m68k/mcf5206/console/mcfuart.c
@@ -519,19 +519,20 @@ mcfuart_interrupt_handler(rtems_vector_number vec)
 ssize_t
 mcfuart_interrupt_write(mcfuart *uart, const char *buf, size_t len)
 {
-    int level;
-    rtems_interrupt_disable(level);
-    uart->tx_buf = buf;
-    uart->tx_buf_len = len;
-    uart->tx_ptr = 0;
-    *MCF5206E_UIMR(MBAR, uart->chn) =
-            MCF5206E_UIMR_FFULL | MCF5206E_UIMR_TXRDY;
-    while (((*MCF5206E_USR(MBAR,uart->chn) & MCF5206E_USR_TXRDY) != 0) &&
-           (uart->tx_ptr < uart->tx_buf_len))
+    if (len > 0)
     {
-        *MCF5206E_UTB(MBAR,uart->chn) = uart->tx_buf[uart->tx_ptr++];
+        uart->tx_buf = buf;
+        uart->tx_buf_len = len;
+        uart->tx_ptr = 0;
+        *MCF5206E_UIMR(MBAR, uart->chn) =
+                MCF5206E_UIMR_FFULL | MCF5206E_UIMR_TXRDY;
+        while (((*MCF5206E_USR(MBAR,uart->chn) & MCF5206E_USR_TXRDY) != 0) &&
+               (uart->tx_ptr < uart->tx_buf_len))
+        {
+            *MCF5206E_UTB(MBAR,uart->chn) = uart->tx_buf[uart->tx_ptr++];
+        }
     }
-    rtems_interrupt_enable(level);
+
     return 0;
 }
 
diff --git a/c/src/lib/libcpu/mips/mongoosev/duart/mg5uart.c b/c/src/lib/libcpu/mips/mongoosev/duart/mg5uart.c
index 00e5e79..f198ac9 100644
--- a/c/src/lib/libcpu/mips/mongoosev/duart/mg5uart.c
+++ b/c/src/lib/libcpu/mips/mongoosev/duart/mg5uart.c
@@ -686,7 +686,6 @@ MG5UART_STATIC int mg5uart_write_support_int(
   size_t      len
 )
 {
-  uint32_t        Irql;
   uint32_t        pMG5UART_port;
 
   pMG5UART_port = Console_Port_Tbl[minor]->ulCtrlPort2;
@@ -703,8 +702,6 @@ MG5UART_STATIC int mg5uart_write_support_int(
    *  Put the character out and enable interrupts if necessary.
    */
 
-  rtems_interrupt_disable(Irql);
-
   MG5UART_SETREG(pMG5UART_port, MG5UART_TX_BUFFER, *buf);
 
   if( Console_Port_Data[minor].bActive == FALSE )
@@ -713,7 +710,6 @@ MG5UART_STATIC int mg5uart_write_support_int(
      mg5uart_enable_interrupts(minor, MG5UART_ENABLE_ALL);
   }
 
-  rtems_interrupt_enable(Irql);
   return 1;
 }
 
diff --git a/c/src/lib/libcpu/powerpc/mpc55xx/esci/esci.c b/c/src/lib/libcpu/powerpc/mpc55xx/esci/esci.c
index d8f6c41..f546739 100644
--- a/c/src/lib/libcpu/powerpc/mpc55xx/esci/esci.c
+++ b/c/src/lib/libcpu/powerpc/mpc55xx/esci/esci.c
@@ -292,13 +292,12 @@ static int mpc55xx_esci_termios_poll_write( int minor, const char *out,
  */
 static int mpc55xx_esci_termios_write( int minor, const char *out, size_t n)
 {
-	mpc55xx_esci_driver_entry *e = &mpc55xx_esci_driver_table [minor];
-	rtems_interrupt_level level;
+	if (n > 0) {
+		mpc55xx_esci_driver_entry *e = &mpc55xx_esci_driver_table [minor];
 
-	rtems_interrupt_disable(level);
-	e->regs->DR.B.D = out [0];
-	e->transmit_in_progress = true;
-	rtems_interrupt_enable(level);
+		e->regs->DR.B.D = out [0];
+		e->transmit_in_progress = true;
+	}
 
 	return 0;
 }
diff --git a/c/src/lib/libcpu/powerpc/mpc5xx/console-generic/console-generic.c b/c/src/lib/libcpu/powerpc/mpc5xx/console-generic/console-generic.c
index f3e7ff0..8f56c70 100644
--- a/c/src/lib/libcpu/powerpc/mpc5xx/console-generic/console-generic.c
+++ b/c/src/lib/libcpu/powerpc/mpc5xx/console-generic/console-generic.c
@@ -144,10 +144,13 @@ ssize_t m5xx_uart_write(
   size_t len
 )
 {
-  volatile m5xxSCIRegisters_t *regs = sci_descs[minor].regs;
+  if (len > 0) {
+    volatile m5xxSCIRegisters_t *regs = sci_descs[minor].regs;
+
+    regs->scdr = *buf;			/* start transmission */
+    regs->sccr1 |= QSMCM_SCI_TIE;		/* enable interrupt */
+  }
 
-  regs->scdr = *buf;			/* start transmission */
-  regs->sccr1 |= QSMCM_SCI_TIE;		/* enable interrupt */
   return 0;
 }
 
diff --git a/c/src/lib/libcpu/powerpc/mpc8260/console-generic/console-generic.c b/c/src/lib/libcpu/powerpc/mpc8260/console-generic/console-generic.c
index 1ae1dbe..b43d95c 100644
--- a/c/src/lib/libcpu/powerpc/mpc8260/console-generic/console-generic.c
+++ b/c/src/lib/libcpu/powerpc/mpc8260/console-generic/console-generic.c
@@ -1090,12 +1090,15 @@ m8xx_uart_write(
   size_t len
 )
 {
-  while( (TxBd[minor]->status) & M8260_BD_READY );
+  if (len > 0) {
+    while( (TxBd[minor]->status) & M8260_BD_READY );
+
+    rtems_cache_flush_multiple_data_lines( buf, len );
+    TxBd[minor]->buffer = (char *) buf;
+    TxBd[minor]->length = len;
+    TxBd[minor]->status = M8260_BD_READY | M8260_BD_WRAP | M8260_BD_INTERRUPT;
+  }
 
-  rtems_cache_flush_multiple_data_lines( buf, len );
-  TxBd[minor]->buffer = (char *) buf;
-  TxBd[minor]->length = len;
-  TxBd[minor]->status = M8260_BD_READY | M8260_BD_WRAP | M8260_BD_INTERRUPT;
   return 0;
 }
 
diff --git a/c/src/lib/libcpu/powerpc/ppc403/console/console.c b/c/src/lib/libcpu/powerpc/ppc403/console/console.c
index 58d0138..0e74879 100644
--- a/c/src/lib/libcpu/powerpc/ppc403/console/console.c
+++ b/c/src/lib/libcpu/powerpc/ppc403/console/console.c
@@ -271,8 +271,11 @@ spiPollRead (int minor)
 static int
 spiInterruptWrite (int minor, const char *buf, int len)
 {
-  port->SPTB = *buf;           /* write char to send         */
-  port->SPTC |= TCRIntEnabled; /* always enable tx interrupt */
+  if (len > 0) {
+    port->SPTB = *buf;           /* write char to send         */
+    port->SPTC |= TCRIntEnabled; /* always enable tx interrupt */
+  }
+
   return 0;
 }
 
diff --git a/c/src/lib/libcpu/powerpc/ppc403/console/console405.c b/c/src/lib/libcpu/powerpc/ppc403/console/console405.c
index 033a9ef..206d209 100644
--- a/c/src/lib/libcpu/powerpc/ppc403/console/console405.c
+++ b/c/src/lib/libcpu/powerpc/ppc403/console/console405.c
@@ -296,8 +296,11 @@ spiStopRemoteTx (int minor)
 
 static ssize_t InterruptWrite (int minor, const char *buf, size_t len)
 {
-  port->IER |= IER_XMT;     /* always enable tx interrupt */
-  port->THR = *buf; 	    /* write char to send         */
+  if (len > 0) {
+    port->IER |= IER_XMT;     /* always enable tx interrupt */
+    port->THR = *buf; 	    /* write char to send         */
+  }
+
   return 0;
 }
 
diff --git a/c/src/lib/libcpu/sh/sh7750/sci/sh4uart.c b/c/src/lib/libcpu/sh/sh7750/sci/sh4uart.c
index 8400a20..a2b2dad 100644
--- a/c/src/lib/libcpu/sh/sh7750/sci/sh4uart.c
+++ b/c/src/lib/libcpu/sh/sh7750/sci/sh4uart.c
@@ -761,24 +761,21 @@ sh4uart2_interrupt_transmit(rtems_vector_number vec)
 rtems_status_code
 sh4uart_interrupt_write(sh4uart *uart, const char *buf, int len)
 {
-  volatile uint8_t  *scr1 = (volatile uint8_t *)SH7750_SCSCR1;
-  volatile uint16_t *scr2 = (volatile uint16_t *)SH7750_SCSCR2;
-  int level;
-
-  while ((SCSSR1 & SH7750_SCSSR1_TEND) == 0);
-
-  rtems_interrupt_disable(level);
+  if (len > 0) {
+    volatile uint8_t  *scr1 = (volatile uint8_t *)SH7750_SCSCR1;
+    volatile uint16_t *scr2 = (volatile uint16_t *)SH7750_SCSCR2;
 
-  uart->tx_buf = buf;
-  uart->tx_buf_len = len;
-  uart->tx_ptr = 0;
+    while ((SCSSR1 & SH7750_SCSSR1_TEND) == 0);
 
-  if (uart->chn == SH4_SCI)
-    *scr1 |= SH7750_SCSCR_TIE;
-  else
-    *scr2 |= SH7750_SCSCR_TIE;
+    uart->tx_buf = buf;
+    uart->tx_buf_len = len;
+    uart->tx_ptr = 0;
 
-  rtems_interrupt_enable(level);
+    if (uart->chn == SH4_SCI)
+      *scr1 |= SH7750_SCSCR_TIE;
+    else
+      *scr2 |= SH7750_SCSCR_TIE;
+  }
 
   return RTEMS_SUCCESSFUL;
 }




More information about the vc mailing list