Skip to contentSkip to conversation

FAILED: patch "[PATCH] spi: bcm2835: Fix 3-wire mode if DMA is enabled" failed to apply to 5.2-stable tree

PATCH [email protected] 2 participants 5 messages Aug 7, 2019 – Aug 8, 2019

Subsystems (4)
lore
Share & tools
lore

[email protected]

author maintainer
#0 lore raw

The patch below does not apply to the 5.2-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.

thanks,

greg k-h

------------------ original commit in Linus's tree ------------------

From 8d8bef50365847134b51c1ec46786bc2873e4e47 Mon Sep 17 00:00:00 2001
From: Lukas Wunner <[email protected]>
Date: Wed, 3 Jul 2019 12:29:31 +0200
Subject: [PATCH] spi: bcm2835: Fix 3-wire mode if DMA is enabled
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Commit 6935224da248 ("spi: bcm2835: enable support of 3-wire mode") added 3-wire support to the BCM2835 SPI driver by setting the REN bit (Read Enable) in the CS register when receiving data. The REN bit puts the transmitter in high-impedance state. The driver recognizes that data is to be received by checking whether the rx_buf of a transfer is non-NULL.

Commit 3ecd37edaa2a ("spi: bcm2835: enable dma modes for transfers meeting certain conditions") subsequently broke 3-wire support because it set the SPI_MASTER_MUST_RX flag which causes spi_map_msg() to replace rx_buf with a dummy buffer if it is NULL. As a result, rx_buf is *always* non-NULL if DMA is enabled.

Reinstate 3-wire support by not only checking whether rx_buf is non-NULL, but also checking that it is not the dummy buffer.

drivers/spi/spi-bcm2835.c +2 -1
index 6f243a90c844..840b1b8ff3dc 100644
@@ -834,7 +834,8 @@ static int bcm2835_spi_transfer_one(struct spi_controller *ctlr,
 	bcm2835_wr(bs, BCM2835_SPI_CLK, cdiv);
 
 	/* handle all the 3-wire mode */
-	if ((spi->mode & SPI_3WIRE) && (tfr->rx_buf))
+	if (spi->mode & SPI_3WIRE && tfr->rx_buf &&
+	    tfr->rx_buf != ctlr->dummy_rx)
 		cs |= BCM2835_SPI_CS_REN;
 	else
 		cs &= ~BCM2835_SPI_CS_REN;
#1 lore raw
Quoted 1 line · On Wed, Aug 07, 2019 at 06:48:07PM +0200, [email protected] wrote:

The patch below does not apply to the 5.2-stable tree.

That's odd, it works for me:

$ git fetch linux-stable
$ git checkout linux-stable/linux-5.2.y
Checking out files: 100% (43562/43562), done.
HEAD is now at 5697a9d... Linux 5.2.7
$ git am /tmp/pt
Applying: spi: bcm2835: Fix 3-wire mode if DMA is enabled

Could you be a little more specific why it couldn't be applied when you tried it?

Thanks,

Lukas

Quoted 58 lines

If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.

thanks,

greg k-h

------------------ original commit in Linus's tree ------------------

From 8d8bef50365847134b51c1ec46786bc2873e4e47 Mon Sep 17 00:00:00 2001
From: Lukas Wunner <[email protected]>
Date: Wed, 3 Jul 2019 12:29:31 +0200
Subject: [PATCH] spi: bcm2835: Fix 3-wire mode if DMA is enabled
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Commit 6935224da248 ("spi: bcm2835: enable support of 3-wire mode") added 3-wire support to the BCM2835 SPI driver by setting the REN bit (Read Enable) in the CS register when receiving data. The REN bit puts the transmitter in high-impedance state. The driver recognizes that data is to be received by checking whether the rx_buf of a transfer is non-NULL.

Commit 3ecd37edaa2a ("spi: bcm2835: enable dma modes for transfers meeting certain conditions") subsequently broke 3-wire support because it set the SPI_MASTER_MUST_RX flag which causes spi_map_msg() to replace rx_buf with a dummy buffer if it is NULL. As a result, rx_buf is *always* non-NULL if DMA is enabled.

Reinstate 3-wire support by not only checking whether rx_buf is non-NULL, but also checking that it is not the dummy buffer.

drivers/spi/spi-bcm2835.c +2 -1
index 6f243a90c844..840b1b8ff3dc 100644
@@ -834,7 +834,8 @@ static int bcm2835_spi_transfer_one(struct spi_controller *ctlr,
 	bcm2835_wr(bs, BCM2835_SPI_CLK, cdiv);
 
 	/* handle all the 3-wire mode */
-	if ((spi->mode & SPI_3WIRE) && (tfr->rx_buf))
+	if (spi->mode & SPI_3WIRE && tfr->rx_buf &&
+	    tfr->rx_buf != ctlr->dummy_rx)
 		cs |= BCM2835_SPI_CS_REN;
 	else
 		cs &= ~BCM2835_SPI_CS_REN;
author maintainer
#2 lore raw
Quoted 12 lines · Lukas Wunner
Quoted 1 line · On Wed, Aug 07, 2019 at 06:48:07PM +0200, [email protected] wrote:

The patch below does not apply to the 5.2-stable tree.

That's odd, it works for me:

$ git fetch linux-stable
$ git checkout linux-stable/linux-5.2.y
Checking out files: 100% (43562/43562), done.
HEAD is now at 5697a9d... Linux 5.2.7
$ git am /tmp/pt
Applying: spi: bcm2835: Fix 3-wire mode if DMA is enabled
Quoted 2 lines

Could you be a little more specific why it couldn't be applied when you tried it?

Sorry, that's the problem of form letters, sometimes they are wrong :(

The patch applies everywhere, but breaks the build in all trees. So it needs to be modified to build properly. I need to write up a different error message for this type of failure one of these days, luckily it is pretty rare.

thanks,

greg k-h

Acked-by Stefan Wahren
#3 lore raw
Quoted 5 lines · Greg KH
Quoted 2 lines · Lukas Wunner
Quoted 1 line · On Wed, Aug 07, 2019 at 06:48:07PM +0200, [email protected] wrote:

The patch below does not apply to the 5.2-stable tree.

The patch applies everywhere, but breaks the build in all trees.

Ugh, yes you are right, my apologies.

The reason is that v5.3 converted spi-bcm2835.c to use the "spi_controller" nomenclature instead of "spi_master" with commit 5f336ea53b6b ("spi: bcm2835: Replace spi_master by spi_controller").

The replacement patch below should hopefully not break the build. It's the same as upstream commit 8d8bef503658, except one occurrence of "ctlr" is replaced by "master".

Thanks!

-- >8 --
From 8d8bef50365847134b51c1ec46786bc2873e4e47 Mon Sep 17 00:00:00 2001
From: Lukas Wunner <[email protected]>
Date: Wed, 3 Jul 2019 12:29:31 +0200
Subject: [PATCH] spi: bcm2835: Fix 3-wire mode if DMA is enabled
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Commit 6935224da248 ("spi: bcm2835: enable support of 3-wire mode") added 3-wire support to the BCM2835 SPI driver by setting the REN bit (Read Enable) in the CS register when receiving data. The REN bit puts the transmitter in high-impedance state. The driver recognizes that data is to be received by checking whether the rx_buf of a transfer is non-NULL.

Commit 3ecd37edaa2a ("spi: bcm2835: enable dma modes for transfers meeting certain conditions") subsequently broke 3-wire support because it set the SPI_MASTER_MUST_RX flag which causes spi_map_msg() to replace rx_buf with a dummy buffer if it is NULL. As a result, rx_buf is *always* non-NULL if DMA is enabled.

Reinstate 3-wire support by not only checking whether rx_buf is non-NULL, but also checking that it is not the dummy buffer.

drivers/spi/spi-bcm2835.c +2 -1
index 6f243a90c844..840b1b8ff3dc 100644
@@ -834,7 +834,8 @@ static int bcm2835_spi_transfer_one(struct spi_master *master,
 	bcm2835_wr(bs, BCM2835_SPI_CLK, cdiv);
 
 	/* handle all the 3-wire mode */
-	if ((spi->mode & SPI_3WIRE) && (tfr->rx_buf))
+	if (spi->mode & SPI_3WIRE && tfr->rx_buf &&
+	    tfr->rx_buf != master->dummy_rx)
 		cs |= BCM2835_SPI_CS_REN;
 	else
 		cs &= ~BCM2835_SPI_CS_REN;
author maintainer
#4 lore raw
Quoted 9 lines · Lukas Wunner
Quoted 5 lines · Greg KH
Quoted 2 lines · Lukas Wunner
Quoted 1 line · On Wed, Aug 07, 2019 at 06:48:07PM +0200, [email protected] wrote:

The patch below does not apply to the 5.2-stable tree.

The patch applies everywhere, but breaks the build in all trees.

Ugh, yes you are right, my apologies.

Quoted 8 lines

The reason is that v5.3 converted spi-bcm2835.c to use the "spi_controller" nomenclature instead of "spi_master" with commit 5f336ea53b6b ("spi: bcm2835: Replace spi_master by spi_controller").

The replacement patch below should hopefully not break the build. It's the same as upstream commit 8d8bef503658, except one occurrence of "ctlr" is replaced by "master".

Thanks for this, now queued up.

greg k-h