On 3/8/21 8:36 PM, Chris Packham wrote: > > On 9/03/21 11:10 am, Chris Packham wrote: >> >> On 8/03/21 5:59 pm, Guenter Roeck wrote: >>> On 3/7/21 8:37 PM, Chris Packham wrote: >>> [ ... ] >>>>> That's from -ENXIO which is used in only one place in i2c-mpc.c. I'll >>>>> enable some debug and see what we get. >>>> For the errant readings there was nothing abnormal reported by the >>>> driver. >>>> >>>> For the "No such device or address" I saw "mpc-i2c ffe119000.i2c: No >>>> RXAK" which matches up with the -ENXIO return. >>>> >>> Id suggest to check the time until not busy and stop in mpc_xfer(). >>> Those hot loops are unusual, and may well mess up the code especially >>> if preempt is enabled. >> Reworking those loops seems to have had a positive result. I'll do a >> bit more testing and hopefully get a patch out later today. > D'oh my "fix" was to replace the cond_reshed() with msleep(10) which did > "fix" the problem but made every i2c read slow. I didn't notice when > testing just the lm81 but as soon as I booted the system with more i2c > devices I saw stupidly slow boot times. msleep() is indeed a bad idea. You'd want something like usleep_range() with increasing timeout. Like start with a few uS and double the sleep time with each iteration (eg 4-8 / 8-16 / 16-32 / 32-64 / ...). Guenter