On Wed, 16 Nov 2011 09:28:29 -0800, York Sun wrote: > I am not sure if this mail will reach the list as I am not subscribed. > > In the v2 patch (actually both version), you wrote > > > + byte = readb(i2c->base + MPC_I2C_DR); > > + > > + /* Adjust length if first received byte is length */ > > + if (i == 0 && recv_len) { > > + if (byte == 0 || byte > I2C_SMBUS_BLOCK_MAX) > > + return -EPROTO; > > + length += byte; > > + /* > > + * For block reads, generate txack here if data length > > + * is 1 byte (total length is 2 bytes). > > + */ > > + if (length == 2) > > + writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA > > + | CCR_TXAK); > > + } > > + data[i] = byte; > > I am wondering if the first byte should be left out for data[] if the > recv_len is non-zero. If I understand correctly, this patch is to > support of SMBus with multiple byte read. The SMBus is different from > I2C bus on multiple byte. The first data is byte count vs slave data for > I2C. So you will receive all data preceded by the byte count, which is > one more than your loop. That's why he wrote length += byte; and not length = byte; length is initialized to 1 for SMBus block reads. -- Jean Delvare -- 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