Patch "serial: sc16is7xx: fix unconditional activation of THRI interrupt" has been added to the 6.6-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    serial: sc16is7xx: fix unconditional activation of THRI interrupt

to the 6.6-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     serial-sc16is7xx-fix-unconditional-activation-of-thr.patch
and it can be found in the queue-6.6 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 7ed0b06857b773a12e579c757d6e9aff74b2ab39
Author: Hugo Villeneuve <hvilleneuve@xxxxxxxxxxxx>
Date:   Mon Dec 11 12:13:53 2023 -0500

    serial: sc16is7xx: fix unconditional activation of THRI interrupt
    
    [ Upstream commit 9915753037eba7135b209fef4f2afeca841af816 ]
    
    Commit cc4c1d05eb10 ("sc16is7xx: Properly resume TX after stop") changed
    behavior to unconditionnaly set the THRI interrupt in sc16is7xx_tx_proc().
    
    For example when sending a 65 bytes message, and assuming the Tx FIFO is
    initially empty, sc16is7xx_handle_tx() will write the first 64 bytes of the
    message to the FIFO and sc16is7xx_tx_proc() will then activate THRI. When
    the THRI IRQ is fired, the driver will write the remaining byte of the
    message to the FIFO, and disable THRI by calling sc16is7xx_stop_tx().
    
    When sending a 2 bytes message, sc16is7xx_handle_tx() will write the 2
    bytes of the message to the FIFO and call sc16is7xx_stop_tx(), disabling
    THRI. After sc16is7xx_handle_tx() exits, control returns to
    sc16is7xx_tx_proc() which will unconditionally set THRI. When the THRI IRQ
    is fired, the driver simply acknowledges the interrupt and does nothing
    more, since all the data has already been written to the FIFO. This results
    in 2 register writes and 4 register reads all for nothing and taking
    precious cycles from the I2C/SPI bus.
    
    Fix this by enabling the THRI interrupt only when we fill the Tx FIFO to
    its maximum capacity and there are remaining bytes to send in the message.
    
    Fixes: cc4c1d05eb10 ("sc16is7xx: Properly resume TX after stop")
    Cc:  <stable@xxxxxxxxxxxxxxx>
    Signed-off-by: Hugo Villeneuve <hvilleneuve@xxxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20231211171353.2901416-7-hugo@xxxxxxxxxxx
    Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/tty/serial/sc16is7xx.c b/drivers/tty/serial/sc16is7xx.c
index 425093ce3f24..f75b8bceb8ca 100644
--- a/drivers/tty/serial/sc16is7xx.c
+++ b/drivers/tty/serial/sc16is7xx.c
@@ -676,6 +676,8 @@ static void sc16is7xx_handle_tx(struct uart_port *port)
 
 	if (uart_circ_empty(xmit))
 		sc16is7xx_stop_tx(port);
+	else
+		sc16is7xx_ier_set(port, SC16IS7XX_IER_THRI_BIT);
 	uart_port_unlock_irqrestore(port, flags);
 }
 
@@ -802,7 +804,6 @@ static void sc16is7xx_tx_proc(struct kthread_work *ws)
 {
 	struct uart_port *port = &(to_sc16is7xx_one(ws, tx_work)->port);
 	struct sc16is7xx_one *one = to_sc16is7xx_one(port, port);
-	unsigned long flags;
 
 	if ((port->rs485.flags & SER_RS485_ENABLED) &&
 	    (port->rs485.delay_rts_before_send > 0))
@@ -811,10 +812,6 @@ static void sc16is7xx_tx_proc(struct kthread_work *ws)
 	mutex_lock(&one->efr_lock);
 	sc16is7xx_handle_tx(port);
 	mutex_unlock(&one->efr_lock);
-
-	uart_port_lock_irqsave(port, &flags);
-	sc16is7xx_ier_set(port, SC16IS7XX_IER_THRI_BIT);
-	uart_port_unlock_irqrestore(port, flags);
 }
 
 static void sc16is7xx_reconf_rs485(struct uart_port *port)




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux