summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2013-06-24 17:29:11 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2013-06-25 17:03:21 +0200
commite18db9f0cffcb143e5fdec27539efb417cb4ebf3 (patch)
tree804edba552541bea8d5ea5c38680903373bf6c27
parentbsps/arm: Rename function (diff)
downloadrtems-e18db9f0cffcb143e5fdec27539efb417cb4ebf3.tar.bz2
termios: Update due to API changes
Termios notifies now the driver about an inactive transmit with the length argument set to zero.
-rw-r--r--c/src/lib/libbsp/arm/csb336/console/uart.c10
-rw-r--r--c/src/lib/libbsp/arm/shared/comm/uart.c4
-rw-r--r--c/src/lib/libbsp/lm32/shared/milkymist_console/console.c7
-rw-r--r--c/src/lib/libbsp/m68k/av5282/console/console.c17
-rw-r--r--c/src/lib/libbsp/m68k/gen68340/console/console.c12
-rw-r--r--c/src/lib/libbsp/m68k/gen68360/console/console.c9
-rw-r--r--c/src/lib/libbsp/m68k/genmcf548x/console/console.c17
-rw-r--r--c/src/lib/libbsp/m68k/mcf52235/console/console.c17
-rw-r--r--c/src/lib/libbsp/m68k/mcf5225x/console/console.c17
-rw-r--r--c/src/lib/libbsp/m68k/mcf5235/console/console.c17
-rw-r--r--c/src/lib/libbsp/m68k/mcf5329/console/console.c17
-rw-r--r--c/src/lib/libbsp/m68k/mvme167/console/console.c62
-rw-r--r--c/src/lib/libbsp/m68k/uC5282/console/console.c17
-rw-r--r--c/src/lib/libbsp/powerpc/gen5200/console/console.c40
-rw-r--r--c/src/lib/libbsp/powerpc/qoriq/console/uart-bridge-slave.c44
-rw-r--r--c/src/lib/libbsp/powerpc/shared/console/uart.c3
-rw-r--r--c/src/lib/libbsp/powerpc/tqm8xx/console/console.c37
-rw-r--r--c/src/lib/libbsp/sparc/erc32/console/erc32_console.c34
-rw-r--r--c/src/lib/libbsp/sparc/leon3/console/console.c29
-rw-r--r--c/src/lib/libcpu/bfin/serial/uart.c17
-rw-r--r--c/src/lib/libcpu/m68k/mcf5206/console/mcfuart.c23
-rw-r--r--c/src/lib/libcpu/mips/mongoosev/duart/mg5uart.c4
-rw-r--r--c/src/lib/libcpu/powerpc/mpc55xx/esci/esci.c11
-rw-r--r--c/src/lib/libcpu/powerpc/mpc5xx/console-generic/console-generic.c9
-rw-r--r--c/src/lib/libcpu/powerpc/mpc8260/console-generic/console-generic.c13
-rw-r--r--c/src/lib/libcpu/powerpc/ppc403/console/console.c7
-rw-r--r--c/src/lib/libcpu/powerpc/ppc403/console/console405.c7
-rw-r--r--c/src/lib/libcpu/sh/sh7750/sci/sh4uart.c27
28 files changed, 256 insertions, 272 deletions
diff --git a/c/src/lib/libbsp/arm/csb336/console/uart.c b/c/src/lib/libbsp/arm/csb336/console/uart.c
index 4dc409b40c..4c64832b23 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 6015e0d11b..390a07d028 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 1abde5f8c1..a7c3a29493 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 25f012237e..85ec37fcc0 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 17d4ef4707..d1fa02edf0 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 0c43317ef7..8233449003 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 af18e23d7e..5e85e208b9 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 b0ac4f9949..0b508c5f75 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 1f81e40ce4..48fca9f2c4 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 5c00adf36a..d0e556c473 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 f0c798029b..8f72270fa3 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 a03eda8888..ca16631cec 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 a213cbca2f..2c133d7bb7 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 93a3ab779a..a70e06d3e7 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 86f5de87a8..5fc0b95de1 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 1079af12ac..67816e38db 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 312bed2a87..b28987899e 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 08606957d4..2acc72f156 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 3870685b50..566b0581f6 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 36ea3497bd..a264d9e8e4 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 27f2278525..89468d1dc1 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 00e5e7921e..f198ac9a92 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 d8f6c41423..f5467397bd 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 f3e7ff081e..8f56c708a5 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 1ae1dbedce..b43d95c83d 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 58d0138398..0e74879947 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 033a9ef41e..206d209c82 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 8400a20dd4..a2b2dadbc8 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;
}