On 05.04.2022 14:09, Michael Walle wrote: > Am 2022-04-05 12:02, schrieb Codrin.Ciubotariu@xxxxxxxxxxxxx: >> On 05.04.2022 12:38, Michael Walle wrote: >>> Am 2022-04-05 11:23, schrieb Codrin.Ciubotariu@xxxxxxxxxxxxx: >>>>> + if (dev->use_dma) { >>>>> + dma_buf = i2c_get_dma_safe_msg_buf(m_start, 1); >>>> >>>> If you want, you could just dev->buf = i2c_get_dma_safe... >>> >>> But where is the error handling in that case? dev->buf will >>> be NULL, which is eventually passed to dma_map_single(). >>> >>> Also, I need the dma_buf for the i2c_put_dma_safe_msg_buf() >>> call anyway, because dev->buf will be modified during >>> processing. >> >> You still: >> if (!dev->buf) { >> ret = -ENOMEM; >> goto out; >> } >> >> So, at91_do_twi_transfer()/dma_map_single() will not be called. > > Ahh, I misunderstood you. Yes, but as I said, I need the dma_buf > temporary variable anyway, because dev->buf is modified, eg. see > at91_twi_read_data_dma_callback(). at91_twi_read_data_dma_callback() is called as callback if dma_async_issue_pending(dma->chan_rx) is called. dma_async_issue_pending(dma->chan_rx) is called on at91_twi_read_data_dma(), which is called in at91_do_twi_transfer(), which we decided above to skip in case of error.