Hi all, I am enqueuing the following patch. Comments welcome. Drop I2C_SMBUS_I2C_BLOCK_MAX, use I2C_SMBUS_BLOCK_MAX instead. I2C_SMBUS_I2C_BLOCK_MAX has always been defined to the same value as I2C_SMBUS_BLOCK_MAX, and this will never change: setting it to a lower value would make no sense, setting it to a higher value would break i2c_smbus_data compatibility. There is no point in changing i2c_smbus_data nor i2c-core to support larger block transactions in SMBus mode, as no SMBus hardware supports more than 32 byte blocks. Thus, if anyone ever really wants larger transactions, he/she'd better call i2c_transfer() directly than going through the SMBus compatibility layer. Signed-off-by: Jean Delvare <khali at linux-fr.org> drivers/i2c/chips/eeprom.c | 4 ++-- drivers/i2c/i2c-core.c | 8 ++++---- include/linux/i2c.h | 1 - 3 files changed, 6 insertions(+), 7 deletions(-) --- linux-2.6.14-rc3.orig/drivers/i2c/chips/eeprom.c 2005-09-13 21:21:06.000000000 +0200 +++ linux-2.6.14-rc3/drivers/i2c/chips/eeprom.c 2005-10-05 21:56:04.000000000 +0200 @@ -88,8 +88,8 @@ dev_dbg(&client->dev, "Starting eeprom update, slice %u\n", slice); if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_I2C_BLOCK)) { - for (i = slice << 5; i < (slice + 1) << 5; i += I2C_SMBUS_I2C_BLOCK_MAX) - if (i2c_smbus_read_i2c_block_data(client, i, data->data + i) != I2C_SMBUS_I2C_BLOCK_MAX) + for (i = slice << 5; i < (slice + 1) << 5; i += I2C_SMBUS_BLOCK_MAX) + if (i2c_smbus_read_i2c_block_data(client, i, data->data + i) != I2C_SMBUS_BLOCK_MAX) goto exit; } else { if (i2c_smbus_write_byte(client, slice << 5)) { --- linux-2.6.14-rc3.orig/drivers/i2c/i2c-core.c 2005-10-05 21:55:35.000000000 +0200 +++ linux-2.6.14-rc3/drivers/i2c/i2c-core.c 2005-10-05 21:56:04.000000000 +0200 @@ -1108,10 +1108,10 @@ return -1; case I2C_SMBUS_I2C_BLOCK_DATA: if (read_write == I2C_SMBUS_READ) { - msg[1].len = I2C_SMBUS_I2C_BLOCK_MAX; + msg[1].len = I2C_SMBUS_BLOCK_MAX; } else { msg[0].len = data->block[0] + 1; - if (msg[0].len > I2C_SMBUS_I2C_BLOCK_MAX + 1) { + if (msg[0].len > I2C_SMBUS_BLOCK_MAX + 1) { dev_err(&adapter->dev, "i2c_smbus_xfer_emulated called with " "invalid block write size (%d)\n", data->block[0]); @@ -1144,8 +1144,8 @@ break; case I2C_SMBUS_I2C_BLOCK_DATA: /* fixed at 32 for now */ - data->block[0] = I2C_SMBUS_I2C_BLOCK_MAX; - for (i = 0; i < I2C_SMBUS_I2C_BLOCK_MAX; i++) + data->block[0] = I2C_SMBUS_BLOCK_MAX; + for (i = 0; i < I2C_SMBUS_BLOCK_MAX; i++) data->block[i+1] = msgbuf1[i]; break; } --- linux-2.6.14-rc3.orig/include/linux/i2c.h 2005-10-05 21:55:35.000000000 +0200 +++ linux-2.6.14-rc3/include/linux/i2c.h 2005-10-05 21:56:04.000000000 +0200 @@ -448,7 +448,6 @@ * Data for SMBus Messages */ #define I2C_SMBUS_BLOCK_MAX 32 /* As specified in SMBus standard */ -#define I2C_SMBUS_I2C_BLOCK_MAX 32 /* Not specified but we use same structure */ union i2c_smbus_data { __u8 byte; __u16 word; -- Jean Delvare