Patch "spi: microchip-core: fix the issues in the isr" has been added to the 6.10-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

    spi: microchip-core: fix the issues in the isr

to the 6.10-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:
     spi-microchip-core-fix-the-issues-in-the-isr.patch
and it can be found in the queue-6.10 subdirectory.

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



commit d2ce3331c05b306d33392e2bda336b4f0a5b6977
Author: Naga Sureshkumar Relli <nagasuresh.relli@xxxxxxxxxxxxx>
Date:   Mon Jul 15 12:13:52 2024 +0100

    spi: microchip-core: fix the issues in the isr
    
    [ Upstream commit 502a582b8dd897d9282db47c0911d5320ef2e6b9 ]
    
    It is possible for the TXDONE interrupt be raised if the tx FIFO becomes
    temporarily empty while transmitting, resulting in recursive calls to
    mchp_corespi_write_fifo() and therefore a garbage message might be
    transmitted depending on when the interrupt is triggered. Moving all of
    the tx FIFO writes out of the TXDONE portion of the interrupt handler
    avoids this problem.
    
    Most of rest of the TXDONE portion of the handler is problematic too.
    Only reading the rx FIFO (and finalising the transfer) when the TXDONE
    interrupt is raised can cause the transfer to stall, if the final bytes
    of rx data are not available in the rx FIFO when the final TXDONE
    interrupt is raised. The transfer should be finalised regardless of
    which interrupt is raised, provided that all tx data has been set and
    all rx data received.
    
    The first issue was encountered "in the wild", the second is
    theoretical.
    
    Fixes: 9ac8d17694b6 ("spi: add support for microchip fpga spi controllers")
    Signed-off-by: Naga Sureshkumar Relli <nagasuresh.relli@xxxxxxxxxxxxx>
    Signed-off-by: Conor Dooley <conor.dooley@xxxxxxxxxxxxx>
    Link: https://patch.msgid.link/20240715-candied-deforest-585685ef3c8a@wendy
    Signed-off-by: Mark Brown <broonie@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/spi/spi-microchip-core.c b/drivers/spi/spi-microchip-core.c
index c10de45aa4729..003a2bc3cfd1b 100644
--- a/drivers/spi/spi-microchip-core.c
+++ b/drivers/spi/spi-microchip-core.c
@@ -380,21 +380,18 @@ static irqreturn_t mchp_corespi_interrupt(int irq, void *dev_id)
 	if (intfield == 0)
 		return IRQ_NONE;
 
-	if (intfield & INT_TXDONE) {
+	if (intfield & INT_TXDONE)
 		mchp_corespi_write(spi, REG_INT_CLEAR, INT_TXDONE);
 
+	if (intfield & INT_RXRDY) {
+		mchp_corespi_write(spi, REG_INT_CLEAR, INT_RXRDY);
+
 		if (spi->rx_len)
 			mchp_corespi_read_fifo(spi);
-
-		if (spi->tx_len)
-			mchp_corespi_write_fifo(spi);
-
-		if (!spi->rx_len)
-			finalise = true;
 	}
 
-	if (intfield & INT_RXRDY)
-		mchp_corespi_write(spi, REG_INT_CLEAR, INT_RXRDY);
+	if (!spi->rx_len && !spi->tx_len)
+		finalise = true;
 
 	if (intfield & INT_RX_CHANNEL_OVERFLOW) {
 		mchp_corespi_write(spi, REG_INT_CLEAR, INT_RX_CHANNEL_OVERFLOW);
@@ -479,8 +476,9 @@ static int mchp_corespi_transfer_one(struct spi_controller *host,
 	mchp_corespi_set_xfer_size(spi, (spi->tx_len > FIFO_DEPTH)
 				   ? FIFO_DEPTH : spi->tx_len);
 
-	if (spi->tx_len)
+	while (spi->tx_len)
 		mchp_corespi_write_fifo(spi);
+
 	return 1;
 }
 




[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