On 03/19/2014 04:15 AM, Yoshihiro YUNOMAE wrote: > Add tunable RX interrupt trigger I/F of FIFO buffers. > Serial devices are used as not only message communication devices but control > or sending communication devices. For the latter uses, normally small data > will be exchanged, so user applications want to receive data unit as soon as > possible for real-time tendency. If we have a sensor which sends a 1 byte data > each time and must control a device based on the sensor feedback, the RX > interrupt should be triggered for each data. > > According to HW specification of serial UART devices, RX interrupt trigger > can be changed, but the trigger is hard-coded. For example, RX interrupt trigger > in 16550A can be set to 1, 4, 8, or 14 bytes for HW, but current driver sets > the trigger to only 8bytes. > diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c > index 69932b7..fc17fb2 100644 > --- a/drivers/tty/serial/8250/8250_core.c > +++ b/drivers/tty/serial/8250/8250_core.c > @@ -531,11 +531,10 @@ static void serial8250_clear_fifos(struct uart_8250_port *p) > > void serial8250_clear_and_reinit_fifos(struct uart_8250_port *p) > { > - unsigned char fcr; > - > serial8250_clear_fifos(p); > - fcr = uart_config[p->port.type].fcr; > - serial_out(p, UART_FCR, fcr); > + if (!p->fcr) > + p->fcr = uart_config[p->port.type].fcr; Rather than sprinkling this initialization all over the place, can't the fcr value be set up one time, when the port is first created? > +static int convert_fcr2val(struct uart_8250_port *up, unsigned char fcr) > +{ > + unsigned char trig_raw = fcr & UART_FCR_TRIGGER_MASK; > + > + switch (up->port.type) { > + case PORT_16550A: > + if (trig_raw == UART_FCR_R_TRIG_00) > + return 1; > + else if (trig_raw == UART_FCR_R_TRIG_01) > + return 4; > + else if (trig_raw == UART_FCR_R_TRIG_10) > + return 8; > + else if (trig_raw == UART_FCR_R_TRIG_11) > + return 14; > + break; > + } > + return -EOPNOTSUPP; > +} Rather than implementing this translation inside this one function (well, and convert_val2rxtrig() too), perhaps it would make sense to put the values into uart_config[] and just look them up here. That would better isolate the type-specific data into one place. The comment right before UART_FCR_R_TRIG_00 in include/uapi/linux/serial_reg.h might help when filling in any extra fields in uart_config[]. -- To unsubscribe from this list: send the line "unsubscribe linux-serial" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html