The supplied buffer might be on the stack and we get the following error
message:
[    3.312058] at91_i2c e0070600.i2c: rejecting DMA map of vmalloc memory

Use i2c_{get,put}_dma_safe_msg_buf() to get a DMA-able memory region if
necessary.

Cc: sta...@vger.kernel.org
Signed-off-by: Michael Walle <mich...@walle.cc>
---

I'm not sure if or which Fixes: tag I should add to this patch. The issue
seems to be since a very long time, but nobody seem to have triggered it.
FWIW, I'm using the sff,sfp driver, which triggers this.

 drivers/i2c/busses/i2c-at91-master.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/drivers/i2c/busses/i2c-at91-master.c 
b/drivers/i2c/busses/i2c-at91-master.c
index b0eae94909f4..a7a22fedbaba 100644
--- a/drivers/i2c/busses/i2c-at91-master.c
+++ b/drivers/i2c/busses/i2c-at91-master.c
@@ -656,6 +656,7 @@ static int at91_twi_xfer(struct i2c_adapter *adap, struct 
i2c_msg *msg, int num)
        unsigned int_addr_flag = 0;
        struct i2c_msg *m_start = msg;
        bool is_read;
+       u8 *dma_buf;
 
        dev_dbg(&adap->dev, "at91_xfer: processing %d messages:\n", num);
 
@@ -703,7 +704,18 @@ static int at91_twi_xfer(struct i2c_adapter *adap, struct 
i2c_msg *msg, int num)
        dev->msg = m_start;
        dev->recv_len_abort = false;
 
+       if (dev->use_dma) {
+               dma_buf = i2c_get_dma_safe_msg_buf(m_start, 1);
+               if (!dma_buf) {
+                       ret = -ENOMEM;
+                       goto out;
+               }
+               dev->buf = dma_buf;
+       }
+
+
        ret = at91_do_twi_transfer(dev);
+       i2c_put_dma_safe_msg_buf(dma_buf, m_start, !ret);
 
        ret = (ret < 0) ? ret : num;
 out:
-- 
2.30.2

Reply via email to