i2c address probing and AT24RF08 corruption

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

 



Hi all,

Frodo, please do not forward this mail to the lm_sensors mailing list, I
really want you to read this!

I am starting this thread on the lm_sensors mailing-list with all of you
in copy in the hope to put an end to the Thinkpad issue that has been
plaguing our project since it started, more than five years ago.

In i2c-core as well as in our userspace tools (sensors-detect,
i2cdetect), we are using the SMBus "quick command"
(I2C_FUNC_SMBUS_QUICK) for i2c address probing purposes. This is what
is causing trouble with the AT24RF08 chip found in most Thinkpad
laptops, among other systems.

Our README.thinkpad document states:

"'Write Quick 0' is not an actual write and should never generate a
write operation to an eeprom location."

This is not exact. It should not generate a write operation to an eeprom
location, granted. But this *is* an actual write. Quoting the SMBus
spec:

"Here, part of the slave address denotes the command ? the R/W# bit. The
R/W# bit may be used to simply turn a device function on or off, or
enable/disable a low-power standby mode."

So it clearly states that any chip is entitled to change its state or
whatever it pleases when receiving a "quick command". After reading
this, I cannot blame Atmel for poor hardware design on the AT24RF08
anymore. What's really poor is our use of the "quick command" IMHO.

For this reason, I can hardly understand how it was decided that this
command would be used for address probing purposes. I agree that the
SMBus spec has no provision for address probing, so we have to use
another command to achieve this purpose, still I would expect a
"receive byte" (I2C_FUNC_SMBUS_READ_BYTE) to be way safer than a "quick
command". The only side effect I can think off is that it would
increase the address pointer for chips in autoincrement mode, but
that's about all and it doesn't seem to hurt, really. Another drawback
is that it requires 20 clock cycles instead of 11, but this is
definitely neglectable if it instantly solves the AT24RF08 corruption
issue and possibly other potential problems as well.

The problem is that I can hardly believe that nobody proposed the same
as I am doing right now in 5 years, although I couldn't find any
explanation as to why the "quick command" choice was made in the first
place. The only relevant post (unanswered) I could find is here:
http://archives.andrew.net.au/lm-sensors/msg00465.html

I am seriously planning to change this in all three places (i2c-core,
sensors-detect and i2cdetect) and would like to hear objections if they
exist.

Joe, Mark, you have been testing AT24RF08 chips in the past, could you
tell me if the corruption would also occur if we were sending a bit "1"
(instead of 0) in the "quick command"? I don't plan to do this (no real
reason it would be safer than sending a "0", except that it then looks
like the beginning of a read command instead of a write one) but if it
turns out that using a "receive byte" command for probing is not
possible, then this is another change to consider.

Everyone please speak up and give me your opinion on my proposal. I am
kind of tired of all the overhead work needed just because of the
Thinkpad problem and would like to definitely solve that issue as soon
as possible.

Thanks.

-- 
Jean Delvare
http://www.ensicaen.ismra.fr/~delvare/



[Index of Archives]     [Linux Kernel]     [Linux Hardware Monitoring]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux