[PATCH 0/7] tty: max310x: Simplify the code and fix a few bugs

From: Serge Semin
Date: Tue May 14 2019 - 06:16:10 EST


I started using this driver two years ago in kernek 4.4 and then in kernel
4.9. It didn't go well from the very beginning due to my platform
peculiarities: DW SPI core with hardware CS and relatively slow MIPS-based
SoC. This patchset is intended to fix some of the problems I found out
during the max310x driver utilization with max14830 device.

First of all it was discovered, that workqueue API isn't optimally used.
Work context isn't re-entrant by design, so the mutex used to guard the
TX-method is redundant. schedule_work() method is also created in a way
the work item is scheduled only if it isn't pending. Patch 1 concerns all
these fixes. Seeing the similar container_of(uart_port) is used three
times in the driver, the patch 2 introduces a macro to_max310x_port() to
get a pointer to corresponding struct max310x_one. This is the code
simplification and is going to be used in the following patches.

It was found out, that batch read and write methods used buffers allocated
on the kernel stack. Since they might be utilized by SPI controllers for
DMA it might be unsafe on some platforms. Patch 3 provides a dedicated
kmalloced buffers for this.

The baud-rate calculator function didn't work correct for all the possible
baud-rates requested within a pre-defined input reference frequency.
Instead an algo fully compliant with datasheet divisor formulae is
implemented in patch 4.

Patches 5 and 6 are created to fix some rs485 issues. Particularly the
rs485 mode is configured on the port startup if it's enabled. And seeing
the mode2 register provides a way to enable/disable the echo-suppression
in RS485 mode, it is used to implement the SER_RS485_RX_DURING_TX flag
support.

Finally it was discovered that in case if inbound hardware FIFO
experienced overflow, a lot of '\0' characters inserted into the
flip-buffer as a character of the RX-FIFO overrun. It isn't quite correct
since the overflow happened only after the last character had been
received. Patch 7 is dedicated to push only a single RX-FIFO overrun
character in this case.

Signed-off-by: Serge Semin <fancer.lancer@xxxxxxxxx>


Serge Semin (7):
tty: max310x: Simplify tx-work item code
tty: max310x: Introduce max310x_one port macro-wrapper
tty: max310x: Don't pass stacked buffers to SPI
tty: max310x: Fix invalid baudrate divisors calculator
tty: max310x: Add rx-during-tx rs485 flag support
tty: max310x: Optionally enable rs485 on startup
tty: max310x: Split uart characters insertion loop

drivers/tty/serial/max310x.c | 157 +++++++++++++++++++++--------------
1 file changed, 95 insertions(+), 62 deletions(-)

--
2.21.0