lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Date:	Thu, 11 Jun 2015 13:03:22 -0700
From:	'Dmitry Torokhov' <dmitry.torokhov@...il.com>
To:	DusonLin <dusonlin@....com.tw>
Cc:	linux-kernel@...r.kernel.org, linux-input@...r.kernel.org
Subject: Re: [PATCH] Input - elan_i2c: support multi ic type and iap format

Hi Duson,

On Wed, Jun 10, 2015 at 04:25:08PM +0800, DusonLin wrote:
> Hi Dmitry,
> 
> When can I fetch the newest linux source code and make sure this patch had be merged?

You can either check my tree on kernel.org (depending on the patch it
will be in either for-linus or next branch) or check linux-next git
repository (the patches will also end up there with a delay of about 1
day).

Thanks.

> 
> Thank you
> Duson
> 
> -----Original Message-----
> From: Dmitry Torokhov [mailto:dmitry.torokhov@...il.com] 
> Sent: Tuesday, June 09, 2015 8:09 AM
> To: duson
> Cc: linux-kernel@...r.kernel.org; linux-input@...r.kernel.org
> Subject: Re: [PATCH] Input - elan_i2c: support multi ic type and iap format
> 
> On Sun, Jun 07, 2015 at 03:34:04AM +0800, duson wrote:
> > In order to support multi ic type for i2c/smbus protocol, add get ic 
> > type command and check fw vaild page count and signature address function.
> > 
> > Signed-off by: Duson Lin <dusonlin@....com.tw>
> 
> Applied, thank you (but please try to convince your mailer to not use quoted printable format).
> 
> > ---
> >  drivers/input/mouse/elan_i2c.h       |    5 ++--
> >  drivers/input/mouse/elan_i2c_core.c  |   44 ++++++++++++++++++++++++++++++----
> >  drivers/input/mouse/elan_i2c_i2c.c   |    5 +++-
> >  drivers/input/mouse/elan_i2c_smbus.c |    6 +++--
> >  4 files changed, 49 insertions(+), 11 deletions(-)
> > 
> > diff --git a/drivers/input/mouse/elan_i2c.h 
> > b/drivers/input/mouse/elan_i2c.h index 6d5f8a4..ff622a1 100644
> > --- a/drivers/input/mouse/elan_i2c.h
> > +++ b/drivers/input/mouse/elan_i2c.h
> > @@ -33,9 +33,7 @@
> >  #define ETP_FW_IAP_PAGE_ERR	(1 << 5)
> >  #define ETP_FW_IAP_INTF_ERR	(1 << 4)
> >  #define ETP_FW_PAGE_SIZE	64
> > -#define ETP_FW_VAILDPAGE_COUNT	768
> >  #define ETP_FW_SIGNATURE_SIZE	6
> > -#define ETP_FW_SIGNATURE_ADDRESS	0xBFFA
> >  
> >  struct i2c_client;
> >  struct completion;
> > @@ -58,7 +56,8 @@ struct elan_transport_ops {
> >  				 bool max_baseliune, u8 *value);
> >  
> >  	int (*get_version)(struct i2c_client *client, bool iap, u8 *version);
> > -	int (*get_sm_version)(struct i2c_client *client, u8 *version);
> > +	int (*get_sm_version)(struct i2c_client *client,
> > +			      u8* ic_type, u8 *version);
> >  	int (*get_checksum)(struct i2c_client *client, bool iap, u16 *csum);
> >  	int (*get_product_id)(struct i2c_client *client, u8 *id);
> >  
> > diff --git a/drivers/input/mouse/elan_i2c_core.c 
> > b/drivers/input/mouse/elan_i2c_core.c
> > index fd5068b..81e7bc9 100644
> > --- a/drivers/input/mouse/elan_i2c_core.c
> > +++ b/drivers/input/mouse/elan_i2c_core.c
> > @@ -4,7 +4,7 @@
> >   * Copyright (c) 2013 ELAN Microelectronics Corp.
> >   *
> >   * Author: 林政維 (Duson Lin) <dusonlin@....com.tw>
> > - * Version: 1.5.7
> > + * Version: 1.5.8
> >   *
> >   * Based on cyapa driver:
> >   * copyright (c) 2011-2012 Cypress Semiconductor, Inc.
> > @@ -40,7 +40,7 @@
> >  #include "elan_i2c.h"
> >  
> >  #define DRIVER_NAME		"elan_i2c"
> > -#define ELAN_DRIVER_VERSION	"1.5.7"
> > +#define ELAN_DRIVER_VERSION	"1.5.8"
> >  #define ETP_MAX_PRESSURE	255
> >  #define ETP_FWIDTH_REDUCE	90
> >  #define ETP_FINGER_WIDTH	15
> > @@ -83,6 +83,9 @@ struct elan_tp_data {
> >  	u16			fw_checksum;
> >  	int			pressure_adjustment;
> >  	u8			mode;
> > +	u8			ic_type;
> > +	u16			fw_vaildpage_count;
> > +	u16			fw_signature_address;
> >  
> >  	bool			irq_wake;
> >  
> > @@ -91,6 +94,28 @@ struct elan_tp_data {
> >  	bool			baseline_ready;
> >  };
> >  
> > +static int elan_get_fwinfo(u8 ic_type, u16 *vaildpage_count,
> > +			   u16 *signature_address)
> > +{
> > +	
> > +	switch(ic_type) {
> > +	case 0x09:
> > +		*vaildpage_count = 768;
> > +		break;
> > +	case 0x0D:
> > +		*vaildpage_count = 896;
> > +		break;
> > +	default:
> > +		/* unknown ic type clear value */
> > +		*vaildpage_count = 0;
> > +		*signature_address = 0;
> > +		return -ENXIO;
> > +	}
> > +	*signature_address = (*vaildpage_count * ETP_FW_PAGE_SIZE)
> > +			     - ETP_FW_SIGNATURE_SIZE;
> > +	return 0;
> > +}
> > +
> >  static int elan_enable_power(struct elan_tp_data *data)  {
> >  	int repeat = ETP_RETRY_COUNT;
> > @@ -221,7 +246,8 @@ static int elan_query_device_info(struct elan_tp_data *data)
> >  	if (error)
> >  		return error;
> >  
> > -	error = data->ops->get_sm_version(data->client, &data->sm_version);
> > +	error = data->ops->get_sm_version(data->client, &data->ic_type,
> > +					  &data->sm_version);
> >  	if (error)
> >  		return error;
> >  
> > @@ -234,6 +260,14 @@ static int elan_query_device_info(struct elan_tp_data *data)
> >  	if (error)
> >  		return error;
> >  
> > +	error = elan_get_fwinfo(data->ic_type, &data->fw_vaildpage_count,
> > +				&data->fw_signature_address);
> > +	if (error) {
> > +		dev_err(&data->client->dev,
> > +			"unknown ic type %d\n", data->ic_type);
> > +		return error;
> > +	}
> > +
> >  	return 0;
> >  }
> >  
> > @@ -318,7 +352,7 @@ static int __elan_update_firmware(struct elan_tp_data *data,
> >  	iap_start_addr = get_unaligned_le16(&fw->data[ETP_IAP_START_ADDR * 
> > 2]);
> >  
> >  	boot_page_count = (iap_start_addr * 2) / ETP_FW_PAGE_SIZE;
> > -	for (i = boot_page_count; i < ETP_FW_VAILDPAGE_COUNT; i++) {
> > +	for (i = boot_page_count; i < data->fw_vaildpage_count; i++) {
> >  		u16 checksum = 0;
> >  		const u8 *page = &fw->data[i * ETP_FW_PAGE_SIZE];
> >  
> > @@ -454,7 +488,7 @@ static ssize_t elan_sysfs_update_fw(struct device *dev,
> >  	}
> >  
> >  	/* Firmware file must match signature data */
> > -	fw_signature = &fw->data[ETP_FW_SIGNATURE_ADDRESS];
> > +	fw_signature = &fw->data[data->fw_signature_address];
> >  	if (memcmp(fw_signature, signature, sizeof(signature)) != 0) {
> >  		dev_err(dev, "signature mismatch (expected %*ph, got %*ph)\n",
> >  			(int)sizeof(signature), signature, diff --git 
> > a/drivers/input/mouse/elan_i2c_i2c.c 
> > b/drivers/input/mouse/elan_i2c_i2c.c
> > index a0acbbf..549cdfb 100644
> > --- a/drivers/input/mouse/elan_i2c_i2c.c
> > +++ b/drivers/input/mouse/elan_i2c_i2c.c
> > @@ -259,7 +259,8 @@ static int elan_i2c_get_version(struct i2c_client *client,
> >  	return 0;
> >  }
> >  
> > -static int elan_i2c_get_sm_version(struct i2c_client *client, u8 
> > *version)
> > +static int elan_i2c_get_sm_version(struct i2c_client *client, u8 *ic_type,
> > +				   u8 *version)
> >  {
> >  	int error;
> >  	u8 val[3];
> > @@ -271,9 +272,11 @@ static int elan_i2c_get_sm_version(struct i2c_client *client, u8 *version)
> >  	}
> >  
> >  	*version = val[0];
> > +	*ic_type = val[1];
> >  	return 0;
> >  }
> >  
> > +
> >  static int elan_i2c_get_product_id(struct i2c_client *client, u8 *id)  
> > {
> >  	int error;
> > diff --git a/drivers/input/mouse/elan_i2c_smbus.c 
> > b/drivers/input/mouse/elan_i2c_smbus.c
> > index 30ab80d..c28caef 100644
> > --- a/drivers/input/mouse/elan_i2c_smbus.c
> > +++ b/drivers/input/mouse/elan_i2c_smbus.c
> > @@ -165,7 +165,8 @@ static int elan_smbus_get_version(struct i2c_client *client,
> >  	return 0;
> >  }
> >  
> > -static int elan_smbus_get_sm_version(struct i2c_client *client, u8 
> > *version)
> > +static int elan_smbus_get_sm_version(struct i2c_client *client, u8 *ic_type,
> > +				     u8 *version)
> >  {
> >  	int error;
> >  	u8 val[3];
> > @@ -177,7 +178,8 @@ static int elan_smbus_get_sm_version(struct i2c_client *client, u8 *version)
> >  		return error;
> >  	}
> >  
> > -	*version = val[0]; /* XXX Why 0 and not 2 as in IAP/FW versions? */
> > +	*version = val[0];
> > +	*ic_type = val[1];
> >  	return 0;
> >  }
> 
> --
> Dmitry
> 

-- 
Dmitry
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ