> I2C_INT_ALL_PACKETS_XFER_COMPLETE shall be masked for the PIO mode > I2C_INT_PACKET_XFER_COMPLETE shall be masked for the DMA mode, if I'm not missing something. > for packets with repeated start or continue xfer, PACKET_XFER_COMPLETE will be triggers for packets with stop bit, both PACKET_XFER_COMPLETE and ALL_PACKET_XFER_COMPLETE will be triggered. To be align with what PIO mode is doing, will not use ALL_PACKETS_XFER_COMPLETE for DMA in next version. > > Handle the error-case here: > > if (i2c_dev->msg_err != I2C_ERR_NONE) { > dev_err(i2c_dev->dev, "i2c dma transfer failed\n"); > goto i2c_recover; > } > >... > <--- end of tegra_i2c_xfer_msg() --> > > if (likely(i2c_dev->msg_err == I2C_ERR_NONE)) > return 0; > > i2c_recover: > tegra_i2c_init(i2c_dev); > /* start recovery upon arbitration loss in single master mode */ > if (i2c_dev->msg_err == I2C_ERR_ARBITRATION_LOST) { > if (!i2c_dev->is_multimaster_mode) > return tegra_i2c_issue_bus_clear(i2c_dev); > return -EAGAIN; > } > if (i2c_dev->msg_err == I2C_ERR_NO_ACK) { > if (msg->flags & I2C_M_IGNORE_NAK) > return 0; > return -EREMOTEIO; > } > > return -EIO; When DMA transfer timeout, no need to check for ARB LOST or NO_ACK as if any of those interrupts trigger interrupt handler will terminate dmaengine and completes so DMA timeout will not be seen in those cases and falls thru msg_err check