diff options
-rw-r--r-- | drivers/hid/i2c-hid/i2c-hid.c | 45 |
1 files changed, 13 insertions, 32 deletions
diff --git a/drivers/hid/i2c-hid/i2c-hid.c b/drivers/hid/i2c-hid/i2c-hid.c index b50860db92f1..21aafc8f48c8 100644 --- a/drivers/hid/i2c-hid/i2c-hid.c +++ b/drivers/hid/i2c-hid/i2c-hid.c | |||
@@ -807,34 +807,18 @@ static int i2c_hid_fetch_hid_descriptor(struct i2c_hid *ihid) | |||
807 | unsigned int dsize; | 807 | unsigned int dsize; |
808 | int ret; | 808 | int ret; |
809 | 809 | ||
810 | /* Fetch the length of HID description, retrieve the 4 first bytes: | 810 | /* i2c hid fetch using a fixed descriptor size (30 bytes) */ |
811 | * bytes 0-1 -> length | 811 | i2c_hid_dbg(ihid, "Fetching the HID descriptor\n"); |
812 | * bytes 2-3 -> bcdVersion (has to be 1.00) */ | 812 | ret = i2c_hid_command(client, &hid_descr_cmd, ihid->hdesc_buffer, |
813 | ret = i2c_hid_command(client, &hid_descr_cmd, ihid->hdesc_buffer, 4); | 813 | sizeof(struct i2c_hid_desc)); |
814 | |||
815 | i2c_hid_dbg(ihid, "%s, ihid->hdesc_buffer: %4ph\n", __func__, | ||
816 | ihid->hdesc_buffer); | ||
817 | |||
818 | if (ret) { | 814 | if (ret) { |
819 | dev_err(&client->dev, | 815 | dev_err(&client->dev, "hid_descr_cmd failed\n"); |
820 | "unable to fetch the size of HID descriptor (ret=%d)\n", | ||
821 | ret); | ||
822 | return -ENODEV; | ||
823 | } | ||
824 | |||
825 | dsize = le16_to_cpu(hdesc->wHIDDescLength); | ||
826 | /* | ||
827 | * the size of the HID descriptor should at least contain | ||
828 | * its size and the bcdVersion (4 bytes), and should not be greater | ||
829 | * than sizeof(struct i2c_hid_desc) as we directly fill this struct | ||
830 | * through i2c_hid_command. | ||
831 | */ | ||
832 | if (dsize < 4 || dsize > sizeof(struct i2c_hid_desc)) { | ||
833 | dev_err(&client->dev, "weird size of HID descriptor (%u)\n", | ||
834 | dsize); | ||
835 | return -ENODEV; | 816 | return -ENODEV; |
836 | } | 817 | } |
837 | 818 | ||
819 | /* Validate the length of HID descriptor, the 4 first bytes: | ||
820 | * bytes 0-1 -> length | ||
821 | * bytes 2-3 -> bcdVersion (has to be 1.00) */ | ||
838 | /* check bcdVersion == 1.0 */ | 822 | /* check bcdVersion == 1.0 */ |
839 | if (le16_to_cpu(hdesc->bcdVersion) != 0x0100) { | 823 | if (le16_to_cpu(hdesc->bcdVersion) != 0x0100) { |
840 | dev_err(&client->dev, | 824 | dev_err(&client->dev, |
@@ -843,17 +827,14 @@ static int i2c_hid_fetch_hid_descriptor(struct i2c_hid *ihid) | |||
843 | return -ENODEV; | 827 | return -ENODEV; |
844 | } | 828 | } |
845 | 829 | ||
846 | i2c_hid_dbg(ihid, "Fetching the HID descriptor\n"); | 830 | /* Descriptor length should be 30 bytes as per the specification */ |
847 | 831 | dsize = le16_to_cpu(hdesc->wHIDDescLength); | |
848 | ret = i2c_hid_command(client, &hid_descr_cmd, ihid->hdesc_buffer, | 832 | if (dsize != sizeof(struct i2c_hid_desc)) { |
849 | dsize); | 833 | dev_err(&client->dev, "weird size of HID descriptor (%u)\n", |
850 | if (ret) { | 834 | dsize); |
851 | dev_err(&client->dev, "hid_descr_cmd Fail\n"); | ||
852 | return -ENODEV; | 835 | return -ENODEV; |
853 | } | 836 | } |
854 | |||
855 | i2c_hid_dbg(ihid, "HID Descriptor: %*ph\n", dsize, ihid->hdesc_buffer); | 837 | i2c_hid_dbg(ihid, "HID Descriptor: %*ph\n", dsize, ihid->hdesc_buffer); |
856 | |||
857 | return 0; | 838 | return 0; |
858 | } | 839 | } |
859 | 840 | ||