| From 258dfd92f17d4454594169b9a85f1183ac77b051 Mon Sep 17 00:00:00 2001 |
| From: Wolfram Sang <wsa+renesas@sang-engineering.com> |
| Date: Fri, 24 Aug 2018 16:52:46 +0200 |
| Subject: [PATCH 1804/1808] i2c: sh_mobile: fix leak when using DMA bounce |
| buffer |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| We only freed the bounce buffer after successful DMA, missing the cases |
| where DMA setup may have gone wrong. Use a better location which always |
| gets called after each message and use 'stop_after_dma' as a flag for a |
| successful transfer. |
| |
| Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com> |
| Reviewed-by: Niklas Sรถderlund <niklas.soderlund+renesas@ragnatech.se> |
| Signed-off-by: Wolfram Sang <wsa@the-dreams.de> |
| (cherry picked from commit cebc07d84ad71bc58d6f59b770e4347da48a5a2b) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> |
| --- |
| drivers/i2c/busses/i2c-sh_mobile.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/i2c/busses/i2c-sh_mobile.c b/drivers/i2c/busses/i2c-sh_mobile.c |
| index 5e22d55ea57b..1a9fbcd821d9 100644 |
| --- a/drivers/i2c/busses/i2c-sh_mobile.c |
| +++ b/drivers/i2c/busses/i2c-sh_mobile.c |
| @@ -515,8 +515,6 @@ static void sh_mobile_i2c_dma_callback(void *data) |
| pd->pos = pd->msg->len; |
| pd->stop_after_dma = true; |
| |
| - i2c_put_dma_safe_msg_buf(pd->dma_buf, pd->msg, true); |
| - |
| iic_set_clr(pd, ICIC, 0, ICIC_TDMAE | ICIC_RDMAE); |
| } |
| |
| @@ -722,6 +720,10 @@ static int sh_mobile_i2c_xfer(struct i2c_adapter *adapter, |
| timeout = wait_event_timeout(pd->wait, |
| pd->sr & (ICSR_TACK | SW_DONE), |
| adapter->timeout); |
| + |
| + /* 'stop_after_dma' tells if DMA transfer was complete */ |
| + i2c_put_dma_safe_msg_buf(pd->dma_buf, pd->msg, pd->stop_after_dma); |
| + |
| if (!timeout) { |
| dev_err(pd->dev, "Transfer request timed out\n"); |
| if (pd->dma_direction != DMA_NONE) |
| -- |
| 2.17.1 |
| |