Input: elan_i2c - fix return tests of i2c_smbus_read_block_data()
authorBenjamin Tissoires <benjamin.tissoires@redhat.com>
Fri, 30 Sep 2016 23:42:19 +0000 (16:42 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Mon, 3 Oct 2016 23:41:00 +0000 (16:41 -0700)
i2c_smbus_read_block_data() returns negative errno else the number of
data bytes in the slave's response.

Checking for error not null means the function always fails if the device
answers properly.

So given that we read 3 bytes and access those, better check that we
actually read those 3 bytes.

Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/mouse/elan_i2c_smbus.c

index cb6aecbc1dc28a20885885c4b361ecf8343bc445..e23b2495d52e1558f2b6dc8ff7128550f0e9dae0 100644 (file)
@@ -222,11 +222,13 @@ static int elan_smbus_get_checksum(struct i2c_client *client,
 static int elan_smbus_get_max(struct i2c_client *client,
                              unsigned int *max_x, unsigned int *max_y)
 {
+       int ret;
        int error;
        u8 val[3];
 
-       error = i2c_smbus_read_block_data(client, ETP_SMBUS_RANGE_CMD, val);
-       if (error) {
+       ret = i2c_smbus_read_block_data(client, ETP_SMBUS_RANGE_CMD, val);
+       if (ret != 3) {
+               error = ret < 0 ? ret : -EIO;
                dev_err(&client->dev, "failed to get dimensions: %d\n", error);
                return error;
        }
@@ -240,12 +242,13 @@ static int elan_smbus_get_max(struct i2c_client *client,
 static int elan_smbus_get_resolution(struct i2c_client *client,
                                     u8 *hw_res_x, u8 *hw_res_y)
 {
+       int ret;
        int error;
        u8 val[3];
 
-       error = i2c_smbus_read_block_data(client,
-                                         ETP_SMBUS_RESOLUTION_CMD, val);
-       if (error) {
+       ret = i2c_smbus_read_block_data(client, ETP_SMBUS_RESOLUTION_CMD, val);
+       if (ret != 3) {
+               error = ret < 0 ? ret : -EIO;
                dev_err(&client->dev, "failed to get resolution: %d\n", error);
                return error;
        }
@@ -260,12 +263,13 @@ static int elan_smbus_get_num_traces(struct i2c_client *client,
                                     unsigned int *x_traces,
                                     unsigned int *y_traces)
 {
+       int ret;
        int error;
        u8 val[3];
 
-       error = i2c_smbus_read_block_data(client,
-                                         ETP_SMBUS_XY_TRACENUM_CMD, val);
-       if (error) {
+       ret = i2c_smbus_read_block_data(client, ETP_SMBUS_XY_TRACENUM_CMD, val);
+       if (ret != 3) {
+               error = ret < 0 ? ret : -EIO;
                dev_err(&client->dev, "failed to get trace info: %d\n", error);
                return error;
        }