From e18db9f0cffcb143e5fdec27539efb417cb4ebf3 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 24 Jun 2013 17:29:11 +0200 Subject: 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 | 34 ++++++------ 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, 256 insertions(+), 272 deletions(-) (limited to 'c/src/lib') 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; } -- cgit v1.2.3