diff mbox

[1/4] Input: elan_i2c - fix return tests of i2c_smbus_read_block_data()

Message ID 1475073244-23068-2-git-send-email-benjamin.tissoires@redhat.com (mailing list archive)
State Accepted
Headers show

Commit Message

Benjamin Tissoires Sept. 28, 2016, 2:34 p.m. UTC
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>
---
 drivers/input/mouse/elan_i2c_smbus.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

Comments

Dmitry Torokhov Oct. 1, 2016, 12:02 a.m. UTC | #1
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.tissoires@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
>
diff mbox

Patch

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;
 	}
@@ -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;
 	}