Skip to content

Commit

Permalink
Revert "serial: max310x: rework RX interrupt handling"
Browse files Browse the repository at this point in the history
commit 2334de1 upstream.

This reverts commit fce3c5c.

FIFO is triggered 4 intervals after receiving a byte, it's good
when we don't care about the time of reception, but are only
interested in the presence of any activity on the line.
Unfortunately, this method is not suitable for all tasks,
for example, the RS-485 protocol will not work properly,
since the state machine must track the request-response time
and after the timeout expires, a decision is made that the device
on the line is not responding.

Signed-off-by: Alexander Shiyan <shc_work@mail.ru>
Link: https://lore.kernel.org/r/20210217080608.31192-1-shc_work@mail.ru
Fixes: fce3c5c ("serial: max310x: rework RX interrupt handling")
Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
Cc: stable <stable@vger.kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
shcgit authored and gregkh committed Mar 17, 2021
1 parent 15ab5e4 commit ca67a57
Showing 1 changed file with 5 additions and 24 deletions.
29 changes: 5 additions & 24 deletions drivers/tty/serial/max310x.c
Expand Up @@ -1056,9 +1056,9 @@ static int max310x_startup(struct uart_port *port)
max310x_port_update(port, MAX310X_MODE1_REG,
MAX310X_MODE1_TRNSCVCTRL_BIT, 0);

/* Reset FIFOs */
max310x_port_write(port, MAX310X_MODE2_REG,
MAX310X_MODE2_FIFORST_BIT);
/* Configure MODE2 register & Reset FIFOs*/
val = MAX310X_MODE2_RXEMPTINV_BIT | MAX310X_MODE2_FIFORST_BIT;
max310x_port_write(port, MAX310X_MODE2_REG, val);
max310x_port_update(port, MAX310X_MODE2_REG,
MAX310X_MODE2_FIFORST_BIT, 0);

Expand Down Expand Up @@ -1086,27 +1086,8 @@ static int max310x_startup(struct uart_port *port)
/* Clear IRQ status register */
max310x_port_read(port, MAX310X_IRQSTS_REG);

/*
* Let's ask for an interrupt after a timeout equivalent to
* the receiving time of 4 characters after the last character
* has been received.
*/
max310x_port_write(port, MAX310X_RXTO_REG, 4);

/*
* Make sure we also get RX interrupts when the RX FIFO is
* filling up quickly, so get an interrupt when half of the RX
* FIFO has been filled in.
*/
max310x_port_write(port, MAX310X_FIFOTRIGLVL_REG,
MAX310X_FIFOTRIGLVL_RX(MAX310X_FIFO_SIZE / 2));

/* Enable RX timeout interrupt in LSR */
max310x_port_write(port, MAX310X_LSR_IRQEN_REG,
MAX310X_LSR_RXTO_BIT);

/* Enable LSR, RX FIFO trigger, CTS change interrupts */
val = MAX310X_IRQ_LSR_BIT | MAX310X_IRQ_RXFIFO_BIT | MAX310X_IRQ_TXEMPTY_BIT;
/* Enable RX, TX, CTS change interrupts */
val = MAX310X_IRQ_RXEMPTY_BIT | MAX310X_IRQ_TXEMPTY_BIT;
max310x_port_write(port, MAX310X_IRQEN_REG, val | MAX310X_IRQ_CTS_BIT);

return 0;
Expand Down

0 comments on commit ca67a57

Please sign in to comment.