FAILED: patch "[PATCH] i2c: stm32f7: unmap DMA mapped buffer" failed to apply to 5.4-stable tree
[email protected]
maintainerThe patch below does not apply to the 5.4-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]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-5.4.y
git checkout FETCH_HEAD
git cherry-pick -x 6aae87fe7f180cd93a74466cdb6cf2aa9bb28798
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2025072107-provolone-sagging-274b@gregkh' --subject-prefix 'PATCH 5.4.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 6aae87fe7f180cd93a74466cdb6cf2aa9bb28798 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Goffic?= <[email protected]>
Date: Fri, 4 Jul 2025 10:39:15 +0200
Subject: [PATCH] i2c: stm32f7: unmap DMA mapped buffer
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Before each I2C transfer using DMA, the I2C buffer is DMA'pped to make sure the memory buffer is DMA'able. This is handle in the function stm32_i2c_prep_dma_xfer().
If the transfer fails for any reason the I2C buffer must be unmap. Use the dma_callback to factorize the code and fix this issue.
Note that the stm32f7_i2c_dma_callback() is now called in case of DMA transfer success and error and that the complete() on the dma_complete completion structure is done inconditionnally in case of transfer success or error as well as the dmaengine_terminate_async(). This is allowed as a complete() in case transfer error has no effect as well as a dmaengine_terminate_async() on a transfer success.
Also fix the unneeded cast and remove not more needed variables.
drivers/i2c/busses/i2c-stm32f7.c +7 -13
@@ -739,10 +739,11 @@ static void stm32f7_i2c_disable_dma_req(struct stm32f7_i2c_dev *i2c_dev)static void stm32f7_i2c_dma_callback (void *arg) { -struct stm32f7_i2c_dev *i2c_dev = (struct stm32f7_i2c_dev *)arg; +struct stm32f7_i2c_dev *i2c_dev = arg;struct stm32_i2c_dma *dma = i2c_dev->dma;stm32f7_i2c_disable_dma_req (i2c_dev); +dmaengine_terminate_async (dma->chan_using);dma_unmap_single (i2c_dev->dev, dma->dma_buf, dma->dma_len, dma->dma_data_dir);complete (&dma->dma_complete);
@@ -1510,7 +1511,6 @@ static irqreturn_t stm32f7_i2c_handle_isr_errs(struct stm32f7_i2c_dev *i2c_dev,u16 addr = f7_msg->addr;void __iomem *base = i2c_dev->base;struct device *dev = i2c_dev->dev; -struct stm32_i2c_dma *dma = i2c_dev->dma;/* Bus error */ if (status &STM32F7_I2C_ISR_BERR ) {
@@ -1551,10 +1551,8 @@ static irqreturn_t stm32f7_i2c_handle_isr_errs(struct stm32f7_i2c_dev *i2c_dev, }/* Disable dma */ -if (i2c_dev->use_dma) { -stm32f7_i2c_disable_dma_req (i2c_dev); -dmaengine_terminate_async (dma->chan_using); - } +if (i2c_dev->use_dma) +stm32f7_i2c_dma_callback (i2c_dev); i2c_dev->master_mode = false;complete (&i2c_dev->complete);
@@ -1600,7 +1598,6 @@ static irqreturn_t stm32f7_i2c_isr_event_thread(int irq, void *data) {struct stm32f7_i2c_dev *i2c_dev = data;struct stm32f7_i2c_msg *f7_msg = &i2c_dev->f7_msg; -struct stm32_i2c_dma *dma = i2c_dev->dma;void __iomem *base = i2c_dev->base;u32 status, mask;int ret;
@@ -1619,10 +1616,8 @@ static irqreturn_t stm32f7_i2c_isr_event_thread(int irq, void *data)dev_dbg (i2c_dev->dev,"<%s>: Receive NACK (addr %x)\n" , __func__, f7_msg->addr);writel_relaxed (STM32F7_I2C_ICR_NACKCF , base +STM32F7_I2C_ICR ); -if (i2c_dev->use_dma) { -stm32f7_i2c_disable_dma_req (i2c_dev); -dmaengine_terminate_async (dma->chan_using); - } +if (i2c_dev->use_dma) +stm32f7_i2c_dma_callback (i2c_dev); f7_msg->result = -ENXIO ; }
@@ -1640,8 +1635,7 @@ static irqreturn_t stm32f7_i2c_isr_event_thread(int irq, void *data) ret =wait_for_completion_timeout (&i2c_dev->dma->dma_complete,HZ );if (!ret) {dev_dbg (i2c_dev->dev,"<%s>: Timed out\n" , __func__); -stm32f7_i2c_disable_dma_req (i2c_dev); -dmaengine_terminate_async (dma->chan_using); +stm32f7_i2c_dma_callback (i2c_dev); f7_msg->result = -ETIMEDOUT ; } }