diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-06-24 17:29:11 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-06-25 17:03:21 +0200 |
commit | e18db9f0cffcb143e5fdec27539efb417cb4ebf3 (patch) | |
tree | 804edba552541bea8d5ea5c38680903373bf6c27 /c/src/lib/libbsp/powerpc | |
parent | bsps/arm: Rename function (diff) | |
download | rtems-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.
Diffstat (limited to 'c/src/lib/libbsp/powerpc')
4 files changed, 64 insertions, 60 deletions
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; } |