26.01.2019 0:11, Sowjanya Komatineni пишет: > > >>>>> + if (i2c_dev->has_dma) { >>>>> + ret = tegra_i2c_init_dma_param(i2c_dev, true); >>>>> + if (ret == -EPROBE_DEFER) >>>>> + goto disable_div_clk; >>>>> + ret = tegra_i2c_init_dma_param(i2c_dev, false); >>>>> + if (ret == -EPROBE_DEFER) >>>>> + goto disable_div_clk; >>>> >>>> So tegra_i2c_init_dma_param() could fail, printing a error message, and >>>> probe will succeed? If allocation fails during the driver's probe, then >>>> just fail the probe. Please give the rationale. >>> >>> If APB DMA probe doesn’t happen prior to tegra i2c, DMA is not available by >>> the time tegra_init_dma_param tries to request slave channel and in those >>> cases dma_request_slave_channel_reason will return EPROBE_DEFER for tegra >>> I2C probe to retry >>> >>> In case if DMA is available but DMA buffer allocation fails, then >>> tegra_i2c_init_dma_param returns ENOMEM and probe also fails returning same >>> ENOMEM >> >> Is that what you're going to change in the next version? Your current >> variant of the code doesn't fail the probe on ENOMEM and there is duplicated >> attempt to invoke tegra_i2c_init_dma_param() during the transfer. > > Sorry correction to my previous reply. If DMA buffer allocation fails, > tegra_i2c_init_dma_param returns ENOMEM but probe will succeed as i2c > transaction need to happen during boot for some platform device programming > for successful boot and they use PIO mode as xfer bytes is less and deferring > i2c probe for ENOMEM causes boot to fail so during probe EPROBE_DEFER is only > taken care. > > Re-attempt of tegra_i2c_init_dma_param in xfer happens only if no successful > DMA channel allocation happens prior to that ( during probe in case of > ENOMEM). > DMA mode is mainly for large transfer, and i2c xfer returning failure due to > failing DMA buffer allocation causes boot to hang as platform device > programming need to happen which doesn’t need to use DMA. > Will fix this and will send updated patch to reattempt DMA request and buffer > allocation during DMA mode transfer and will return fail for DMA mode I2C > transfer...
1) The chance to get ENOMEM during is miserable and likely that there are much bigger problems in this case. Hence just fail the probe if tegra_i2c_init_dma_param() fails with any error. 2) What is that super-critical platform device? It is possible to compile tegra-i2c as a kernel module and seems nothing enforces CONFIG_I2C_TEGRA=y. 3) After applying these patches I2C transfers are failing on Tegra20 with "tegra-i2c 7000c400.i2c: Failed to allocate the DMA buffer".