On Wed, Sep 28, 2016 at 04:34:01PM +0200, Benjamin Tissoires wrote: > 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.tissoi...@redhat.com> > --- > drivers/input/mouse/elan_i2c_smbus.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/drivers/input/mouse/elan_i2c_smbus.c > b/drivers/input/mouse/elan_i2c_smbus.c > index cb6aecb..9b43b55 100644 > --- a/drivers/input/mouse/elan_i2c_smbus.c > +++ b/drivers/input/mouse/elan_i2c_smbus.c > @@ -226,7 +226,7 @@ static int elan_smbus_get_max(struct i2c_client *client, > u8 val[3]; > > error = i2c_smbus_read_block_data(client, ETP_SMBUS_RANGE_CMD, val); > - if (error) { > + if (error != 3) { > dev_err(&client->dev, "failed to get dimensions: %d\n", error); > return error;
Unfortunately that means you'll report success if you get 0 from i2c_smbus_read_block_data() or confuse upper layers with positive errors. I'll change this to: ret = i2c_smbus_read_block_data(); if (ret != 3) { error = ret < 0 ? ret : -EIO; ... } Thanks. > } > @@ -245,7 +245,7 @@ static int elan_smbus_get_resolution(struct i2c_client > *client, > > error = i2c_smbus_read_block_data(client, > ETP_SMBUS_RESOLUTION_CMD, val); > - if (error) { > + if (error != 3) { > dev_err(&client->dev, "failed to get resolution: %d\n", error); > return error; > } > @@ -265,7 +265,7 @@ static int elan_smbus_get_num_traces(struct i2c_client > *client, > > error = i2c_smbus_read_block_data(client, > ETP_SMBUS_XY_TRACENUM_CMD, val); > - if (error) { > + if (error != 3) { > dev_err(&client->dev, "failed to get trace info: %d\n", error); > return error; > } > -- > 2.7.4 > -- Dmitry