summaryrefslogtreecommitdiffstats
path: root/c/src/libchip/serial/ns16550.c
diff options
context:
space:
mode:
authorChris Johns <chrisj@rtems.org>2016-04-20 17:12:07 +1000
committerChris Johns <chrisj@rtems.org>2016-05-11 11:45:01 +1000
commit8ce75671eb54d685a34d1af6d5d911907afef603 (patch)
treec49d61936425e5ecbc39b98d4cdf06b8b25e4349 /c/src/libchip/serial/ns16550.c
parenti386/pc386: Add IO and memory support to PCI UART devices. (diff)
downloadrtems-8ce75671eb54d685a34d1af6d5d911907afef603.tar.bz2
ibchip/ns16550: Minor optimisation.
Diffstat (limited to '')
-rw-r--r--c/src/libchip/serial/ns16550.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/c/src/libchip/serial/ns16550.c b/c/src/libchip/serial/ns16550.c
index 12d220cdc6..6473028692 100644
--- a/c/src/libchip/serial/ns16550.c
+++ b/c/src/libchip/serial/ns16550.c
@@ -1,6 +1,6 @@
/**
* @file
- *
+ *
* This file contains the TTY driver for the National Semiconductor NS16550.
*
* This part is widely cloned and second sourced. It is found in a number
@@ -234,7 +234,7 @@ void ns16550_init(int minor)
Console_Port_Data[minor].pDeviceContext=(void *)pns16550Context;
pns16550Context->ucModemCtrl=SP_MODEM_IRQ;
- pNS16550 = c->ulCtrlPort1;
+ pNS16550 = c->ulCtrlPort1;
setReg = c->setRegister;
getReg = c->getRegister;
@@ -389,7 +389,7 @@ void ns16550_outch_polled(console_tbl *c, char out)
void ns16550_write_polled(int minor, char out)
{
console_tbl *c = Console_Port_Tbl [minor];
-
+
ns16550_outch_polled( c, out );
}
@@ -616,27 +616,28 @@ NS16550_STATIC void ns16550_process( int minor)
NS16550Context *ctx = d->pDeviceContext;
uint32_t port = c->ulCtrlPort1;
getRegister_f get = c->getRegister;
- int i = 0;
+ int i;
char buf [SP_FIFO_SIZE];
/* Iterate until no more interrupts are pending */
do {
/* Fetch received characters */
- for (i = 0; i < SP_FIFO_SIZE; ++i) {
- if ((get( port, NS16550_LINE_STATUS) & SP_LSR_RDY) != 0) {
- buf [i] = (char) get(port, NS16550_RECEIVE_BUFFER);
- } else {
- break;
+ i = 0;
+ while ((get(port, NS16550_LINE_STATUS) & SP_LSR_RDY) != 0) {
+ buf[i++] = (char) get(port, NS16550_RECEIVE_BUFFER);
+ if (i == SP_FIFO_SIZE) {
+ /* Enqueue fetched characters */
+ rtems_termios_enqueue_raw_characters( d->termios_data, buf, i);
+ i = 0;
}
}
- /* Enqueue fetched characters */
- rtems_termios_enqueue_raw_characters( d->termios_data, buf, i);
+ if (i > 0)
+ rtems_termios_enqueue_raw_characters( d->termios_data, buf, i);
/* Check if we can dequeue transmitted characters */
if (ctx->transmitFifoChars > 0
&& (get( port, NS16550_LINE_STATUS) & SP_LSR_THOLD) != 0) {
-
/* Dequeue transmitted characters */
rtems_termios_dequeue_characters(
d->termios_data,
@@ -869,6 +870,6 @@ int ns16550_inch_polled(
int ns16550_inbyte_nonblocking_polled(int minor)
{
console_tbl *c = Console_Port_Tbl [minor];
-
+
return ns16550_inch_polled( c );
}