* [PATCH 1/8] i2c: acpi: use 4-argument i2c_smbus_read_block_data()
2026-10-25 2:48 [PATCH 0/8] i2c: convert i2c_smbus_read_block_data() users to pass buffer length Dmitry Torokhov
@ 2026-10-25 2:48 ` Dmitry Torokhov
2026-10-25 2:48 ` [PATCH 2/8] i2c: docs: update i2c_smbus_read_block_data() prototype in writing-clients Dmitry Torokhov
` (6 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Dmitry Torokhov @ 2026-10-25 2:48 UTC (permalink / raw)
To: Mika Westerberg, Andi Shyti, Corey Minyard, Hans de Goede,
Ilpo Järvinen, Sebastian Reichel
Cc: linux-i2c, linux-acpi, linux-kernel, linux-input,
openipmi-developer, platform-driver-x86, linux-pm
Pass I2C_SMBUS_BLOCK_MAX to i2c_smbus_read_block_data() in
i2c_acpi_space_handler().
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
drivers/i2c/i2c-core-acpi.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/i2c/i2c-core-acpi.c b/drivers/i2c/i2c-core-acpi.c
index 84841ed13487..4acce685457f 100644
--- a/drivers/i2c/i2c-core-acpi.c
+++ b/drivers/i2c/i2c-core-acpi.c
@@ -751,7 +751,7 @@ i2c_acpi_space_handler(u32 function, acpi_physical_address command,
case ACPI_GSB_ACCESS_ATTRIB_BLOCK:
if (action == ACPI_READ) {
status = i2c_smbus_read_block_data(client, command,
- gsb->data);
+ I2C_SMBUS_BLOCK_MAX, gsb->data);
if (status >= 0) {
gsb->len = status;
status = 0;
--
2.56.0.257.gf7497c7d27-goog
^ permalink raw reply [flat|nested] 9+ messages in thread* [PATCH 2/8] i2c: docs: update i2c_smbus_read_block_data() prototype in writing-clients
2026-10-25 2:48 [PATCH 0/8] i2c: convert i2c_smbus_read_block_data() users to pass buffer length Dmitry Torokhov
2026-10-25 2:48 ` [PATCH 1/8] i2c: acpi: use 4-argument i2c_smbus_read_block_data() Dmitry Torokhov
@ 2026-10-25 2:48 ` Dmitry Torokhov
2026-10-25 2:48 ` [PATCH 3/8] Input: cyapa - use 4-argument i2c_smbus_read_block_data() Dmitry Torokhov
` (5 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Dmitry Torokhov @ 2026-10-25 2:48 UTC (permalink / raw)
To: Mika Westerberg, Andi Shyti, Corey Minyard, Hans de Goede,
Ilpo Järvinen, Sebastian Reichel
Cc: linux-i2c, linux-acpi, linux-kernel, linux-input,
openipmi-developer, platform-driver-x86, linux-pm
Update the prototype of i2c_smbus_read_block_data() in the SMBus
protocol function table to include the length parameter.
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
Documentation/i2c/writing-clients.rst | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Documentation/i2c/writing-clients.rst b/Documentation/i2c/writing-clients.rst
index 8bab8b16ca8a..896bf79ea564 100644
--- a/Documentation/i2c/writing-clients.rst
+++ b/Documentation/i2c/writing-clients.rst
@@ -366,7 +366,7 @@ in terms of it. Never use this function directly!
s32 i2c_smbus_write_word_data(struct i2c_client *client,
u8 command, u16 value);
s32 i2c_smbus_read_block_data(struct i2c_client *client,
- u8 command, u8 *values);
+ u8 command, u8 length, u8 *values);
s32 i2c_smbus_write_block_data(struct i2c_client *client,
u8 command, u8 length, const u8 *values);
s32 i2c_smbus_read_i2c_block_data(struct i2c_client *client,
--
2.56.0.257.gf7497c7d27-goog
^ permalink raw reply [flat|nested] 9+ messages in thread* [PATCH 3/8] Input: cyapa - use 4-argument i2c_smbus_read_block_data()
2026-10-25 2:48 [PATCH 0/8] i2c: convert i2c_smbus_read_block_data() users to pass buffer length Dmitry Torokhov
2026-10-25 2:48 ` [PATCH 1/8] i2c: acpi: use 4-argument i2c_smbus_read_block_data() Dmitry Torokhov
2026-10-25 2:48 ` [PATCH 2/8] i2c: docs: update i2c_smbus_read_block_data() prototype in writing-clients Dmitry Torokhov
@ 2026-10-25 2:48 ` Dmitry Torokhov
2026-10-25 2:48 ` [PATCH 4/8] Input: elan_i2c " Dmitry Torokhov
` (4 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Dmitry Torokhov @ 2026-10-25 2:48 UTC (permalink / raw)
To: Mika Westerberg, Andi Shyti, Corey Minyard, Hans de Goede,
Ilpo Järvinen, Sebastian Reichel
Cc: linux-i2c, linux-acpi, linux-kernel, linux-input,
openipmi-developer, platform-driver-x86, linux-pm
Pass the transfer length to i2c_smbus_read_block_data() in
cyapa_smbus_read_block(), accounting for the final chunk size.
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
drivers/input/mouse/cyapa_gen3.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/drivers/input/mouse/cyapa_gen3.c b/drivers/input/mouse/cyapa_gen3.c
index fc3fb954523b..0cdebf2c34e7 100644
--- a/drivers/input/mouse/cyapa_gen3.c
+++ b/drivers/input/mouse/cyapa_gen3.c
@@ -256,7 +256,7 @@ ssize_t cyapa_smbus_read_block(struct cyapa *cyapa, u8 cmd, size_t len,
if (SMBUS_GROUP_BLOCK_CMD_MASK & cmd) {
/* read specific block registers command. */
smbus_cmd = SMBUS_ENCODE_RW(cmd, SMBUS_READ);
- ret = i2c_smbus_read_block_data(client, smbus_cmd, values);
+ ret = i2c_smbus_read_block_data(client, smbus_cmd, len, values);
goto out;
}
@@ -265,7 +265,11 @@ ssize_t cyapa_smbus_read_block(struct cyapa *cyapa, u8 cmd, size_t len,
smbus_cmd = SMBUS_ENCODE_IDX(cmd, index);
smbus_cmd = SMBUS_ENCODE_RW(smbus_cmd, SMBUS_READ);
buf = values + I2C_SMBUS_BLOCK_MAX * index;
- ret = i2c_smbus_read_block_data(client, smbus_cmd, buf);
+ ret = i2c_smbus_read_block_data(client, smbus_cmd,
+ min_t(size_t,
+ len - I2C_SMBUS_BLOCK_MAX * index,
+ I2C_SMBUS_BLOCK_MAX),
+ buf);
if (ret < 0)
goto out;
}
--
2.56.0.257.gf7497c7d27-goog
^ permalink raw reply [flat|nested] 9+ messages in thread* [PATCH 4/8] Input: elan_i2c - use 4-argument i2c_smbus_read_block_data()
2026-10-25 2:48 [PATCH 0/8] i2c: convert i2c_smbus_read_block_data() users to pass buffer length Dmitry Torokhov
` (2 preceding siblings ...)
2026-10-25 2:48 ` [PATCH 3/8] Input: cyapa - use 4-argument i2c_smbus_read_block_data() Dmitry Torokhov
@ 2026-10-25 2:48 ` Dmitry Torokhov
2026-10-25 2:48 ` [PATCH 5/8] Input: synaptics-rmi4 " Dmitry Torokhov
` (3 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Dmitry Torokhov @ 2026-10-25 2:48 UTC (permalink / raw)
To: Mika Westerberg, Andi Shyti, Corey Minyard, Hans de Goede,
Ilpo Järvinen, Sebastian Reichel
Cc: linux-i2c, linux-acpi, linux-kernel, linux-input,
openipmi-developer, platform-driver-x86, linux-pm
Convert callers of i2c_smbus_read_block_data() to the 4-argument
variant, specifying the buffer size to avoid buffer overruns.
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
drivers/input/mouse/elan_i2c_smbus.c | 36 +++++++++++++++++++++++-------------
1 file changed, 23 insertions(+), 13 deletions(-)
diff --git a/drivers/input/mouse/elan_i2c_smbus.c b/drivers/input/mouse/elan_i2c_smbus.c
index 0287441cda46..c5091601587a 100644
--- a/drivers/input/mouse/elan_i2c_smbus.c
+++ b/drivers/input/mouse/elan_i2c_smbus.c
@@ -59,7 +59,8 @@ static int elan_smbus_initialize(struct i2c_client *client)
/* Get hello packet */
len = i2c_smbus_read_block_data(client,
- ETP_SMBUS_HELLOPACKET_CMD, values);
+ ETP_SMBUS_HELLOPACKET_CMD,
+ sizeof(values), values);
if (len != ETP_SMBUS_HELLOPACKET_LEN) {
dev_err(&client->dev, "hello packet length fail: %d\n", len);
error = len < 0 ? len : -EIO;
@@ -120,7 +121,8 @@ static int elan_smbus_calibrate_result(struct i2c_client *client, u8 *val)
BUILD_BUG_ON(ETP_CALIBRATE_MAX_LEN > sizeof(buf));
error = i2c_smbus_read_block_data(client,
- ETP_SMBUS_CALIBRATE_QUERY, buf);
+ ETP_SMBUS_CALIBRATE_QUERY,
+ sizeof(buf), buf);
if (error < 0)
return error;
@@ -138,7 +140,7 @@ static int elan_smbus_get_baseline_data(struct i2c_client *client,
max_baseline ?
ETP_SMBUS_MAX_BASELINE_CMD :
ETP_SMBUS_MIN_BASELINE_CMD,
- val);
+ sizeof(val), val);
if (error < 0)
return error;
@@ -156,7 +158,7 @@ static int elan_smbus_get_version(struct i2c_client *client,
error = i2c_smbus_read_block_data(client,
iap ? ETP_SMBUS_IAP_VERSION_CMD :
ETP_SMBUS_FW_VERSION_CMD,
- val);
+ sizeof(val), val);
if (error < 0) {
dev_err(&client->dev, "failed to get %s version: %d\n",
iap ? "IAP" : "FW", error);
@@ -174,7 +176,8 @@ static int elan_smbus_get_sm_version(struct i2c_client *client, u8 pattern,
u8 val[I2C_SMBUS_BLOCK_MAX] = {0};
error = i2c_smbus_read_block_data(client,
- ETP_SMBUS_SM_VERSION_CMD, val);
+ ETP_SMBUS_SM_VERSION_CMD,
+ sizeof(val), val);
if (error < 0) {
dev_err(&client->dev, "failed to get SM version: %d\n", error);
return error;
@@ -192,7 +195,8 @@ static int elan_smbus_get_product_id(struct i2c_client *client, u16 *id)
u8 val[I2C_SMBUS_BLOCK_MAX] = {0};
error = i2c_smbus_read_block_data(client,
- ETP_SMBUS_UNIQUEID_CMD, val);
+ ETP_SMBUS_UNIQUEID_CMD,
+ sizeof(val), val);
if (error < 0) {
dev_err(&client->dev, "failed to get product ID: %d\n", error);
return error;
@@ -211,7 +215,7 @@ static int elan_smbus_get_checksum(struct i2c_client *client,
error = i2c_smbus_read_block_data(client,
iap ? ETP_SMBUS_FW_CHECKSUM_CMD :
ETP_SMBUS_IAP_CHECKSUM_CMD,
- val);
+ sizeof(val), val);
if (error < 0) {
dev_err(&client->dev, "failed to get %s checksum: %d\n",
iap ? "IAP" : "FW", error);
@@ -229,7 +233,8 @@ static int elan_smbus_get_max(struct i2c_client *client,
int error;
u8 val[I2C_SMBUS_BLOCK_MAX] = {0};
- ret = i2c_smbus_read_block_data(client, ETP_SMBUS_RANGE_CMD, val);
+ ret = i2c_smbus_read_block_data(client, ETP_SMBUS_RANGE_CMD,
+ sizeof(val), val);
if (ret != 3) {
error = ret < 0 ? ret : -EIO;
dev_err(&client->dev, "failed to get dimensions: %d\n", error);
@@ -249,7 +254,8 @@ static int elan_smbus_get_resolution(struct i2c_client *client,
int error;
u8 val[I2C_SMBUS_BLOCK_MAX] = {0};
- ret = i2c_smbus_read_block_data(client, ETP_SMBUS_RESOLUTION_CMD, val);
+ ret = i2c_smbus_read_block_data(client, ETP_SMBUS_RESOLUTION_CMD,
+ sizeof(val), val);
if (ret != 3) {
error = ret < 0 ? ret : -EIO;
dev_err(&client->dev, "failed to get resolution: %d\n", error);
@@ -270,7 +276,8 @@ static int elan_smbus_get_num_traces(struct i2c_client *client,
int error;
u8 val[I2C_SMBUS_BLOCK_MAX] = {0};
- ret = i2c_smbus_read_block_data(client, ETP_SMBUS_XY_TRACENUM_CMD, val);
+ ret = i2c_smbus_read_block_data(client, ETP_SMBUS_XY_TRACENUM_CMD,
+ sizeof(val), val);
if (ret != 3) {
error = ret < 0 ? ret : -EIO;
dev_err(&client->dev, "failed to get trace info: %d\n", error);
@@ -297,7 +304,8 @@ static int elan_smbus_iap_get_mode(struct i2c_client *client,
u16 constant;
u8 val[I2C_SMBUS_BLOCK_MAX] = {0};
- error = i2c_smbus_read_block_data(client, ETP_SMBUS_IAP_CTRL_CMD, val);
+ error = i2c_smbus_read_block_data(client, ETP_SMBUS_IAP_CTRL_CMD,
+ sizeof(val), val);
if (error < 0) {
dev_err(&client->dev, "failed to read iap ctrol register: %d\n",
error);
@@ -384,7 +392,7 @@ static int elan_smbus_prepare_fw_update(struct i2c_client *client, u16 ic_type,
*/
len = i2c_smbus_read_block_data(client,
ETP_SMBUS_IAP_PASSWORD_READ,
- val);
+ sizeof(val), val);
if (len < (int)sizeof(u16)) {
error = len < 0 ? len : -EIO;
dev_err(dev, "failed to read iap password: %d\n",
@@ -454,7 +462,8 @@ static int elan_smbus_write_fw_block(struct i2c_client *client, u16 fw_page_size
usleep_range(8000, 10000);
error = i2c_smbus_read_block_data(client,
- ETP_SMBUS_IAP_CTRL_CMD, val);
+ ETP_SMBUS_IAP_CTRL_CMD,
+ sizeof(val), val);
if (error < 0) {
dev_err(dev, "Failed to read IAP write result: %d\n",
error);
@@ -493,6 +502,7 @@ static int elan_smbus_get_report(struct i2c_client *client,
len = i2c_smbus_read_block_data(client,
ETP_SMBUS_PACKET_QUERY,
+ ETP_SMBUS_REPORT_LEN,
&report[ETP_SMBUS_REPORT_OFFSET]);
if (len < 0) {
dev_err(&client->dev, "failed to read report data: %d\n", len);
--
2.56.0.257.gf7497c7d27-goog
^ permalink raw reply [flat|nested] 9+ messages in thread* [PATCH 5/8] Input: synaptics-rmi4 - use 4-argument i2c_smbus_read_block_data()
2026-10-25 2:48 [PATCH 0/8] i2c: convert i2c_smbus_read_block_data() users to pass buffer length Dmitry Torokhov
` (3 preceding siblings ...)
2026-10-25 2:48 ` [PATCH 4/8] Input: elan_i2c " Dmitry Torokhov
@ 2026-10-25 2:48 ` Dmitry Torokhov
2026-10-25 2:48 ` [PATCH 6/8] ipmi: ssif: " Dmitry Torokhov
` (2 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Dmitry Torokhov @ 2026-10-25 2:48 UTC (permalink / raw)
To: Mika Westerberg, Andi Shyti, Corey Minyard, Hans de Goede,
Ilpo Järvinen, Sebastian Reichel
Cc: linux-i2c, linux-acpi, linux-kernel, linux-input,
openipmi-developer, platform-driver-x86, linux-pm
Pass the transfer length to i2c_smbus_read_block_data() in
smb_block_read().
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
drivers/input/rmi4/rmi_smbus.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/input/rmi4/rmi_smbus.c b/drivers/input/rmi4/rmi_smbus.c
index 8b61c2382297..a180becb7670 100644
--- a/drivers/input/rmi4/rmi_smbus.c
+++ b/drivers/input/rmi4/rmi_smbus.c
@@ -172,13 +172,13 @@ static int rmi_smb_write_block(struct rmi_transport_dev *xport, u16 rmiaddr,
/* SMB block read - wrapper over ic2_smb_read_block */
static int smb_block_read(struct rmi_transport_dev *xport,
- u8 commandcode, void *buf, size_t len)
+ u8 commandcode, void *buf, size_t len)
{
struct rmi_smb_xport *rmi_smb =
container_of(xport, struct rmi_smb_xport, xport);
struct i2c_client *client = rmi_smb->client;
- return i2c_smbus_read_block_data(client, commandcode, buf);
+ return i2c_smbus_read_block_data(client, commandcode, len, buf);
}
static int rmi_smb_read_block(struct rmi_transport_dev *xport, u16 rmiaddr,
--
2.56.0.257.gf7497c7d27-goog
^ permalink raw reply [flat|nested] 9+ messages in thread* [PATCH 6/8] ipmi: ssif: use 4-argument i2c_smbus_read_block_data()
2026-10-25 2:48 [PATCH 0/8] i2c: convert i2c_smbus_read_block_data() users to pass buffer length Dmitry Torokhov
` (4 preceding siblings ...)
2026-10-25 2:48 ` [PATCH 5/8] Input: synaptics-rmi4 " Dmitry Torokhov
@ 2026-10-25 2:48 ` Dmitry Torokhov
2026-10-25 2:48 ` [PATCH 7/8] platform/x86: x86-android-tablets: " Dmitry Torokhov
2026-10-25 2:48 ` [PATCH 8/8] power: supply: sbs-battery: " Dmitry Torokhov
7 siblings, 0 replies; 9+ messages in thread
From: Dmitry Torokhov @ 2026-10-25 2:48 UTC (permalink / raw)
To: Mika Westerberg, Andi Shyti, Corey Minyard, Hans de Goede,
Ilpo Järvinen, Sebastian Reichel
Cc: linux-i2c, linux-acpi, linux-kernel, linux-input,
openipmi-developer, platform-driver-x86, linux-pm
Pass the receive buffer capacity to i2c_smbus_read_block_data() in
ipmi_ssif_thread() via the i2c_size field, and update ssif_i2c_send()
callers to pass the receive buffer size.
Update read_response(), do_cmd(), and test_multipart_messages() to
accept the response buffer length, clamping the transfer size to
I2C_SMBUS_BLOCK_MAX when reading from the device.
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
drivers/char/ipmi/ipmi_ssif.c | 39 +++++++++++++++++++++------------------
1 file changed, 21 insertions(+), 18 deletions(-)
diff --git a/drivers/char/ipmi/ipmi_ssif.c b/drivers/char/ipmi/ipmi_ssif.c
index 2361103c5edc..9c0aebec2946 100644
--- a/drivers/char/ipmi/ipmi_ssif.c
+++ b/drivers/char/ipmi/ipmi_ssif.c
@@ -503,7 +503,7 @@ static int ipmi_ssif_thread(void *data)
} else {
result = i2c_smbus_read_block_data(
ssif_info->client, ssif_info->i2c_command,
- ssif_info->i2c_data);
+ ssif_info->i2c_size, ssif_info->i2c_data);
if (result < 0)
ssif_info->done_handler(ssif_info, result,
NULL, 0);
@@ -541,7 +541,7 @@ static void start_get(struct ssif_info *ssif_info)
ssif_i2c_send(ssif_info, msg_done_handler, I2C_SMBUS_READ,
SSIF_IPMI_RESPONSE,
- ssif_info->recv, I2C_SMBUS_BLOCK_DATA);
+ ssif_info->recv, sizeof(ssif_info->recv));
}
static void start_resend(struct ssif_info *ssif_info);
@@ -669,7 +669,7 @@ static void msg_done_handler(struct ssif_info *ssif_info, int result,
ssif_i2c_send(ssif_info, msg_done_handler, I2C_SMBUS_READ,
SSIF_IPMI_MULTI_PART_RESPONSE_MIDDLE,
- ssif_info->recv, I2C_SMBUS_BLOCK_DATA);
+ ssif_info->recv, sizeof(ssif_info->recv));
return;
} else if (ssif_info->multi_pos) {
/* Middle of multi-part read. Start the next transaction. */
@@ -736,7 +736,7 @@ static void msg_done_handler(struct ssif_info *ssif_info, int result,
I2C_SMBUS_READ,
SSIF_IPMI_MULTI_PART_RESPONSE_MIDDLE,
ssif_info->recv,
- I2C_SMBUS_BLOCK_DATA);
+ sizeof(ssif_info->recv));
return;
}
}
@@ -1314,12 +1314,15 @@ static void ssif_remove(struct i2c_client *client)
kfree(ssif_info);
}
-static int read_response(struct i2c_client *client, unsigned char *resp)
+static int read_response(struct i2c_client *client, unsigned char *resp,
+ size_t resp_length)
{
int ret = -ENODEV, retry_cnt = SSIF_RECV_RETRIES;
while (retry_cnt > 0) {
ret = i2c_smbus_read_block_data(client, SSIF_IPMI_RESPONSE,
+ min_t(size_t, resp_length,
+ I2C_SMBUS_BLOCK_MAX),
resp);
if (ret > 0)
break;
@@ -1333,7 +1336,7 @@ static int read_response(struct i2c_client *client, unsigned char *resp)
}
static int do_cmd(struct i2c_client *client, int len, unsigned char *msg,
- int *resp_len, unsigned char *resp)
+ int *resp_len, unsigned char *resp, size_t resp_length)
{
int retry_cnt;
int ret;
@@ -1350,14 +1353,14 @@ static int do_cmd(struct i2c_client *client, int len, unsigned char *msg,
return -ENODEV;
}
- ret = read_response(client, resp);
+ ret = read_response(client, resp, resp_length);
if (ret > 0) {
/* Validate that the response is correct. */
if (ret < 3 ||
(resp[0] != (msg[0] | (1 << 2))) ||
(resp[1] != msg[1]))
ret = -EINVAL;
- else if (ret > IPMI_MAX_MSG_LENGTH) {
+ else if (ret > resp_length) {
ret = -E2BIG;
} else {
*resp_len = ret;
@@ -1382,7 +1385,7 @@ static int ssif_detect(struct i2c_client *client, struct i2c_board_info *info)
/* Do a Get Device ID command, since it is required. */
msg[0] = IPMI_NETFN_APP_REQUEST << 2;
msg[1] = IPMI_GET_DEVICE_ID_CMD;
- rv = do_cmd(client, 2, msg, &len, resp);
+ rv = do_cmd(client, 2, msg, &len, resp, IPMI_MAX_MSG_LENGTH);
if (rv)
rv = -ENODEV;
else {
@@ -1523,7 +1526,7 @@ static int start_multipart_test(struct i2c_client *client,
static void test_multipart_messages(struct i2c_client *client,
struct ssif_info *ssif_info,
- unsigned char *resp)
+ unsigned char *resp, size_t resp_length)
{
unsigned char msg[65];
int ret;
@@ -1572,7 +1575,7 @@ static void test_multipart_messages(struct i2c_client *client,
1, msg + 64);
if (!ret)
- ret = read_response(client, resp);
+ ret = read_response(client, resp, resp_length);
if (ret > 0) {
/* End transactions work, we are good. */
@@ -1590,7 +1593,7 @@ static void test_multipart_messages(struct i2c_client *client,
SSIF_IPMI_MULTI_PART_REQUEST_MIDDLE,
0, msg + 64);
if (!ret)
- ret = read_response(client, resp);
+ ret = read_response(client, resp, resp_length);
if (ret > 0)
/* Zero-size end parts work, use those. */
return;
@@ -1748,7 +1751,7 @@ static int ssif_probe(struct i2c_client *client)
msg[0] = IPMI_NETFN_APP_REQUEST << 2;
msg[1] = IPMI_GET_SYSTEM_INTERFACE_CAPABILITIES_CMD;
msg[2] = 0; /* SSIF */
- rv = do_cmd(client, 3, msg, &len, resp);
+ rv = do_cmd(client, 3, msg, &len, resp, IPMI_MAX_MSG_LENGTH);
if (!rv && (len >= 3) && (resp[2] == 0)) {
if (len < 7) {
if (ssif_dbg_probe)
@@ -1800,13 +1803,13 @@ static int ssif_probe(struct i2c_client *client)
ssif_info->supports_pec = 0;
}
- test_multipart_messages(client, ssif_info, resp);
+ test_multipart_messages(client, ssif_info, resp, IPMI_MAX_MSG_LENGTH);
/* Make sure the NMI timeout is cleared. */
msg[0] = IPMI_NETFN_APP_REQUEST << 2;
msg[1] = IPMI_CLEAR_MSG_FLAGS_CMD;
msg[2] = WDT_PRE_TIMEOUT_INT;
- rv = do_cmd(client, 3, msg, &len, resp);
+ rv = do_cmd(client, 3, msg, &len, resp, IPMI_MAX_MSG_LENGTH);
if (rv || (len < 3) || (resp[2] != 0))
dev_warn(&ssif_info->client->dev,
"Unable to clear message flags: %d %d %2.2x\n",
@@ -1815,7 +1818,7 @@ static int ssif_probe(struct i2c_client *client)
/* Attempt to enable the event buffer. */
msg[0] = IPMI_NETFN_APP_REQUEST << 2;
msg[1] = IPMI_GET_BMC_GLOBAL_ENABLES_CMD;
- rv = do_cmd(client, 2, msg, &len, resp);
+ rv = do_cmd(client, 2, msg, &len, resp, IPMI_MAX_MSG_LENGTH);
if (rv || (len < 4) || (resp[2] != 0)) {
dev_warn(&ssif_info->client->dev,
"Error getting global enables: %d %d %2.2x\n",
@@ -1835,7 +1838,7 @@ static int ssif_probe(struct i2c_client *client)
msg[0] = IPMI_NETFN_APP_REQUEST << 2;
msg[1] = IPMI_SET_BMC_GLOBAL_ENABLES_CMD;
msg[2] = ssif_info->global_enables | IPMI_BMC_EVT_MSG_BUFF;
- rv = do_cmd(client, 3, msg, &len, resp);
+ rv = do_cmd(client, 3, msg, &len, resp, IPMI_MAX_MSG_LENGTH);
if (rv || (len < 2)) {
dev_warn(&ssif_info->client->dev,
"Error setting global enables: %d %d %2.2x\n",
@@ -1857,7 +1860,7 @@ static int ssif_probe(struct i2c_client *client)
msg[0] = IPMI_NETFN_APP_REQUEST << 2;
msg[1] = IPMI_SET_BMC_GLOBAL_ENABLES_CMD;
msg[2] = ssif_info->global_enables | IPMI_BMC_RCV_MSG_INTR;
- rv = do_cmd(client, 3, msg, &len, resp);
+ rv = do_cmd(client, 3, msg, &len, resp, IPMI_MAX_MSG_LENGTH);
if (rv || (len < 2)) {
dev_warn(&ssif_info->client->dev,
"Error setting global enables: %d %d %2.2x\n",
--
2.56.0.257.gf7497c7d27-goog
^ permalink raw reply [flat|nested] 9+ messages in thread* [PATCH 7/8] platform/x86: x86-android-tablets: use 4-argument i2c_smbus_read_block_data()
2026-10-25 2:48 [PATCH 0/8] i2c: convert i2c_smbus_read_block_data() users to pass buffer length Dmitry Torokhov
` (5 preceding siblings ...)
2026-10-25 2:48 ` [PATCH 6/8] ipmi: ssif: " Dmitry Torokhov
@ 2026-10-25 2:48 ` Dmitry Torokhov
2026-10-25 2:48 ` [PATCH 8/8] power: supply: sbs-battery: " Dmitry Torokhov
7 siblings, 0 replies; 9+ messages in thread
From: Dmitry Torokhov @ 2026-10-25 2:48 UTC (permalink / raw)
To: Mika Westerberg, Andi Shyti, Corey Minyard, Hans de Goede,
Ilpo Järvinen, Sebastian Reichel
Cc: linux-i2c, linux-acpi, linux-kernel, linux-input,
openipmi-developer, platform-driver-x86, linux-pm
Pass the expected response length and destination buffer directly to
i2c_smbus_read_block_data() in atla10_ec_cmd() instead of copying
through an intermediate buffer.
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
drivers/platform/x86/x86-android-tablets/vexia_atla10_ec.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/drivers/platform/x86/x86-android-tablets/vexia_atla10_ec.c b/drivers/platform/x86/x86-android-tablets/vexia_atla10_ec.c
index 67dba9aa51f6..bbfa040cd4ec 100644
--- a/drivers/platform/x86/x86-android-tablets/vexia_atla10_ec.c
+++ b/drivers/platform/x86/x86-android-tablets/vexia_atla10_ec.c
@@ -65,16 +65,14 @@ struct atla10_ec_data {
static int atla10_ec_cmd(struct atla10_ec_data *data, u8 cmd, u8 len, u8 *values)
{
struct device *dev = &data->client->dev;
- u8 buf[I2C_SMBUS_BLOCK_MAX];
int ret;
- ret = i2c_smbus_read_block_data(data->client, cmd, buf);
+ ret = i2c_smbus_read_block_data(data->client, cmd, len, values);
if (ret != len) {
dev_err(dev, "I2C command 0x%02x error: %d\n", cmd, ret);
return -EIO;
}
- memcpy(values, buf, len);
return 0;
}
--
2.56.0.257.gf7497c7d27-goog
^ permalink raw reply [flat|nested] 9+ messages in thread* [PATCH 8/8] power: supply: sbs-battery: use 4-argument i2c_smbus_read_block_data()
2026-10-25 2:48 [PATCH 0/8] i2c: convert i2c_smbus_read_block_data() users to pass buffer length Dmitry Torokhov
` (6 preceding siblings ...)
2026-10-25 2:48 ` [PATCH 7/8] platform/x86: x86-android-tablets: " Dmitry Torokhov
@ 2026-10-25 2:48 ` Dmitry Torokhov
7 siblings, 0 replies; 9+ messages in thread
From: Dmitry Torokhov @ 2026-10-25 2:48 UTC (permalink / raw)
To: Mika Westerberg, Andi Shyti, Corey Minyard, Hans de Goede,
Ilpo Järvinen, Sebastian Reichel
Cc: linux-i2c, linux-acpi, linux-kernel, linux-input,
openipmi-developer, platform-driver-x86, linux-pm
Pass the destination buffer size to sbs_read_string_data(), and pass
the buffer capacity reserving space for a trailing NUL terminator to
i2c_smbus_read_block_data().
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
drivers/power/supply/sbs-battery.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/drivers/power/supply/sbs-battery.c b/drivers/power/supply/sbs-battery.c
index 6714313bb3a3..f8b194c58a62 100644
--- a/drivers/power/supply/sbs-battery.c
+++ b/drivers/power/supply/sbs-battery.c
@@ -424,7 +424,8 @@ static int sbs_read_string_data_fallback(struct i2c_client *client, u8 address,
return ret;
}
-static int sbs_read_string_data(struct i2c_client *client, u8 address, char *values)
+static int sbs_read_string_data(struct i2c_client *client, u8 address,
+ char *values, size_t size)
{
struct sbs_info *chip = i2c_get_clientdata(client);
int retries = chip->i2c_retry_count;
@@ -440,7 +441,7 @@ static int sbs_read_string_data(struct i2c_client *client, u8 address, char *val
}
while (retries > 0) {
- ret = i2c_smbus_read_block_data(client, address, values);
+ ret = i2c_smbus_read_block_data(client, address, size - 1, values);
if (ret >= 0)
break;
retries--;
@@ -709,7 +710,8 @@ static const char *sbs_get_constant_string(struct sbs_info *chip,
addr = sbs_data[ret].addr;
- ret = sbs_read_string_data(chip->client, addr, buf);
+ ret = sbs_read_string_data(chip->client, addr, buf,
+ sizeof(chip->strings[0]));
if (ret < 0)
return ERR_PTR(ret);
}
--
2.56.0.257.gf7497c7d27-goog
^ permalink raw reply [flat|nested] 9+ messages in thread