Message ID | 20191127032329.8406-1-admin@kryma.net (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Jiri Kosina |
Headers | show |
Series | Add an I2C HID quirk for incorrect input length. | expand |
On Wed, Nov 27, 2019 at 03:23:29AM +0000, admin@kryma.net wrote: > From: Pavel Balan <admin@kryma.net> > > Apply it to the Lenovo Y720 gaming laptop I2C peripheral then. > > This fixes dmesg being flooded with errors visible on un-suspend > in Linux Mint 19 Cinnamon. > > Example of error log: > > <...> > [ 4.326588] i2c_hid i2c-ITE33D1:00: i2c_hid_get_input: incomplete report (2/4) > [ 4.326845] i2c_hid i2c-ITE33D1:00: i2c_hid_get_input: incomplete report (2/4) > [ 4.327095] i2c_hid i2c-ITE33D1:00: i2c_hid_get_input: incomplete report (2/4) > [ 4.327341] i2c_hid i2c-ITE33D1:00: i2c_hid_get_input: incomplete report (2/4) > [ 4.327609] i2c_hid i2c-ITE33D1:00: i2c_hid_get_input: incomplete report (2/4) > <...> > > Example of fixed log (debug on) > > <...> > [ 3731.333183] i2c_hid i2c-ITE33D1:00: input: 02 00 > [ 3731.333581] i2c_hid i2c-ITE33D1:00: input: 02 00 > [ 3731.333842] i2c_hid i2c-ITE33D1:00: input: 02 00 > [ 3731.334107] i2c_hid i2c-ITE33D1:00: input: 02 00 > [ 3731.334367] i2c_hid i2c-ITE33D1:00: input: 02 00 > <...> This should go to Jiri/Benjamin (CCed). > > Signed-off-by: Pavel Balan <admin@kryma.net> > --- > drivers/hid/hid-ids.h | 1 + > drivers/hid/i2c-hid/i2c-hid-core.c | 15 ++++++++++++--- > 2 files changed, 13 insertions(+), 3 deletions(-) > > diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h > index 76969a22b0f2..ea518daf7435 100644 > --- a/drivers/hid/hid-ids.h > +++ b/drivers/hid/hid-ids.h > @@ -628,6 +628,7 @@ > #define USB_VENDOR_ID_ITE 0x048d > #define USB_DEVICE_ID_ITE_LENOVO_YOGA 0x8386 > #define USB_DEVICE_ID_ITE_LENOVO_YOGA2 0x8350 > +#define I2C_DEVICE_ID_ITE_LENOVO_LEGION_Y720 0x837a > #define USB_DEVICE_ID_ITE_LENOVO_YOGA900 0x8396 > #define USB_DEVICE_ID_ITE8595 0x8595 > > diff --git a/drivers/hid/i2c-hid/i2c-hid-core.c b/drivers/hid/i2c-hid/i2c-hid-core.c > index 2a7c6e33bb1c..14d964700a7c 100644 > --- a/drivers/hid/i2c-hid/i2c-hid-core.c > +++ b/drivers/hid/i2c-hid/i2c-hid-core.c > @@ -51,6 +51,7 @@ > #define I2C_HID_QUIRK_NO_RUNTIME_PM BIT(2) > #define I2C_HID_QUIRK_DELAY_AFTER_SLEEP BIT(3) > #define I2C_HID_QUIRK_BOGUS_IRQ BIT(4) > +#define I2C_HID_QUIRK_BAD_INPUT_SIZE BIT(5) > > /* flags */ > #define I2C_HID_STARTED 0 > @@ -182,6 +183,8 @@ static const struct i2c_hid_quirks { > I2C_HID_QUIRK_NO_RUNTIME_PM }, > { USB_VENDOR_ID_ELAN, HID_ANY_ID, > I2C_HID_QUIRK_BOGUS_IRQ }, > + { USB_VENDOR_ID_ITE, I2C_DEVICE_ID_ITE_LENOVO_LEGION_Y720, > + I2C_HID_QUIRK_BAD_INPUT_SIZE }, > { 0, 0 } > }; > > @@ -513,9 +516,15 @@ static void i2c_hid_get_input(struct i2c_hid *ihid) > } > > if ((ret_size > size) || (ret_size < 2)) { > - dev_err(&ihid->client->dev, "%s: incomplete report (%d/%d)\n", > - __func__, size, ret_size); > - return; > + if (ihid->quirks & I2C_HID_QUIRK_BAD_INPUT_SIZE) { > + ihid->inbuf[0] = size & 0xff; > + ihid->inbuf[1] = size >> 8; > + ret_size = size; > + } else { > + dev_err(&ihid->client->dev, "%s: incomplete report (%d/%d)\n", > + __func__, size, ret_size); > + return; > + } > } > > i2c_hid_dbg(ihid, "input: %*ph\n", ret_size, ihid->inbuf); > -- > 2.17.1 >
On Wed, 27 Nov 2019, admin@kryma.net wrote: > From: Pavel Balan <admin@kryma.net> > > Apply it to the Lenovo Y720 gaming laptop I2C peripheral then. > > This fixes dmesg being flooded with errors visible on un-suspend > in Linux Mint 19 Cinnamon. Applied, thanks.
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 76969a22b0f2..ea518daf7435 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h @@ -628,6 +628,7 @@ #define USB_VENDOR_ID_ITE 0x048d #define USB_DEVICE_ID_ITE_LENOVO_YOGA 0x8386 #define USB_DEVICE_ID_ITE_LENOVO_YOGA2 0x8350 +#define I2C_DEVICE_ID_ITE_LENOVO_LEGION_Y720 0x837a #define USB_DEVICE_ID_ITE_LENOVO_YOGA900 0x8396 #define USB_DEVICE_ID_ITE8595 0x8595 diff --git a/drivers/hid/i2c-hid/i2c-hid-core.c b/drivers/hid/i2c-hid/i2c-hid-core.c index 2a7c6e33bb1c..14d964700a7c 100644 --- a/drivers/hid/i2c-hid/i2c-hid-core.c +++ b/drivers/hid/i2c-hid/i2c-hid-core.c @@ -51,6 +51,7 @@ #define I2C_HID_QUIRK_NO_RUNTIME_PM BIT(2) #define I2C_HID_QUIRK_DELAY_AFTER_SLEEP BIT(3) #define I2C_HID_QUIRK_BOGUS_IRQ BIT(4) +#define I2C_HID_QUIRK_BAD_INPUT_SIZE BIT(5) /* flags */ #define I2C_HID_STARTED 0 @@ -182,6 +183,8 @@ static const struct i2c_hid_quirks { I2C_HID_QUIRK_NO_RUNTIME_PM }, { USB_VENDOR_ID_ELAN, HID_ANY_ID, I2C_HID_QUIRK_BOGUS_IRQ }, + { USB_VENDOR_ID_ITE, I2C_DEVICE_ID_ITE_LENOVO_LEGION_Y720, + I2C_HID_QUIRK_BAD_INPUT_SIZE }, { 0, 0 } }; @@ -513,9 +516,15 @@ static void i2c_hid_get_input(struct i2c_hid *ihid) } if ((ret_size > size) || (ret_size < 2)) { - dev_err(&ihid->client->dev, "%s: incomplete report (%d/%d)\n", - __func__, size, ret_size); - return; + if (ihid->quirks & I2C_HID_QUIRK_BAD_INPUT_SIZE) { + ihid->inbuf[0] = size & 0xff; + ihid->inbuf[1] = size >> 8; + ret_size = size; + } else { + dev_err(&ihid->client->dev, "%s: incomplete report (%d/%d)\n", + __func__, size, ret_size); + return; + } } i2c_hid_dbg(ihid, "input: %*ph\n", ret_size, ihid->inbuf);