Re: Intel ICHx bus driver

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

 



Hi Felix,

Please keep the linux-i2c list in Cc.

On Wed, 24 Feb 2010 01:21:51 +0200, Felix Rubinstein wrote:
> On Mon, Feb 22, 2010 at 11:58 PM, Jean Delvare <khali@xxxxxxxxxxxx> wrote:
> > Unlikely. If a timeout occurred, the error message would say so.
> >
> > What is the exact error message? Can we see your complete code?
> 
> Sure, I'm not at the office right now, but will post it asap.
> 
> But hey, I think I've found an issue here.
> Let's delve into the i801 driver code for a moment please.
> 
> in i801_transaction:
> ...
> /* We will always wait for a fraction of a second! */
>          do {
>                  msleep(1);
>                  status = inb_p(SMBHSTSTS);
>          } while ((status & SMBHSTSTS_HOST_BUSY) && (timeout++ < MAX_TIMEOUT));
> ...
> 
> The data sheet states for HST_STS reg for HOST_BUSY bit:
> 1 = Indicates that the ICH9 is running a command from the host interface. No SMB
> registers should be accessed while this bit is set, except the BLOCK DATA BYTE
> Register. The BLOCK DATA BYTE Register can be accessed when this bit is set only
> when the SMB_CMD bits in the Host Control Register are programmed for Block
> command or I2C Read command. This is necessary in order to check the
> DONE_STS bit.
> 
> Remember my case? I'm issuing plain I2C multi byte (straight I2C with
> arbitrary length) transaction, in ICH9 words SMB_CMD is set to Block
> command. Since E32B is enabled, DONE_STS is irrelevant for us in this
> case.

This is correct, assuming you mean I2C block writes and not reads. I2C
block reads are always done in byte-by-byte mode (E32B not set).

> As I understand, in this case we should relay on interrupts and
> not on polling, as both: E32B and Block (write) command are enabled.
>
> That is why in my case I'm seeing timeout > MAX_TIMEOUT.

I fail to see any relation between using interrupts and transaction
types. The i2c-i801 driver does not use interrupts at all at the
moment, it is always polling.

> As an alternative, I could try without E32B?
> 
> What do you think?

You could try this, yes. In fact, it might be a good idea to add a
module parameter to the i2c-i801 driver to let the user disable
features (PEC, block buffer and I2C block read) to use alternative code
paths in case the advanced ones don't work for some reason.

-- 
Jean Delvare
http://khali.linux-fr.org/wishlist.html
--
To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux GPIO]     [Linux SPI]     [Linux Hardward Monitoring]     [LM Sensors]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux