I2C bus driver TIMEDOUT because of PM autosuspend

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I am analysing a problem with I2C bus driver where the problem shows up as I2C bus completely blocked. The LX driver in question is /drivers/i2c/busses/i2c-xiic.c. This driver is for FPGA based I2C controller. Problem is difficult to reproduce, it happens very rarely. So far I saw that the main precondition is to have very heavy I2C traffic on bus. In my case this is achieved/reproduced via netdev driving SFP LEDs via /sys/class/leds/ (via gpio-pca953x). I generate traffic with iperf3. Network traffic is on 10Gbps EMAC. LX kernel is 4.14.0, ARM64, dual core CPU, 2Gbyte mem. What I saw from debugging this problem, is that I2C bus gets in this blocked state when wait_event_timeout() completes because of timeout. The timeout error handling in this driver is probably not robust enough (bus should not remain blocked because of error), but at this moment this are just my speculations (don't know enough details).

Looking the data on oscilloscope, I saw that SCL in single I2C data transfer (several messages) sequence can be interrupted for very long delays, e.g up to hundredths of usec (SCL is 100kHz). There are only two delays in driver code, first in wait_event_timeout and second in set autosuspend delay. I started to suspect that PM autosuspend delay could play some role here. Case is a bit strange because in very busy I2C traffic, PM autosuspend should not be triggered at all. Additionally, if I lower PM timeout, e.g. from 1000 (default) to 100, I hit the problem sooner (waits for problem hit are in order of n*10minutes).

It looks like PM autosupend is playing some role here.

Power management options in my Linux kernel build .config:
# CONFIG_SUSPEND is not set
# CONFIG_PM is not set
CONFIG_ARCH_SUSPEND_POSSIBLE=y

It is not logical (PM is not configured, PM runtime calls are void/empty calls), but this case is repeatedly reproduced on my test setup:

XIIC_PM_TIMEOUT=1000 (or less) -> I2C timeout error, bus blocked

XIIC_PM_TIMEOUT=10000 -> No I2C timeout error

I tried also to build i2c-xiic driver with kernel build defaults and without optimizations (ccflags-y +=  -O0 -g) and also as in-kernel and as loadable module.

Always the same test results.

The workaround that works at the moment is to change PM delay from 1000 (default) to 10000.

Doing so I don't reproduce the problem (24h runs ok), but honestly I don't believe this is fix. More likely the problem is some coincidence timing issue, somewhere.

I intentionally did not put all detail descriptions of embedded system and test setup here (long list), because the main reason of this post is:

I would like to expose/discuss this issue (maintainer of the code, or others). The reason/source of the problem can be much more complex and in some other place.

So my question is who should I contact, is this the M: in the MAINTAINERS list, the MODULE_AUTHOR, ...?
How to proceed.

WBR Primoz


_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@xxxxxxxxxxxxxxxxx
https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies




[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]

  Powered by Linux