RE: [PATCH] HID: i2c-hid: Stop querying for init reports

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Benjamin,


> -----Original Message-----
> From: Benjamin Tissoires [mailto:benjamin.tissoires@xxxxxxxxx]
> Sent: Thursday, October 17, 2013 11:27 PM
> To: Bibek Basu
> Cc: Jiri Kosina; linux-input; linux-kernel@xxxxxxxxxxxxxxx
> Subject: Re: [PATCH] HID: i2c-hid: Stop querying for init reports
> 
> Hi Bibek,
> 
> On Tue, Oct 15, 2013 at 4:28 AM, Bibek Basu <bbasu@xxxxxxxxxx> wrote:
> > According to specifications, HID over I2C devices are not bound to
> > respond to query for INPUT REPORTS. Thus dropping the call during init
> > as many devices does not respond causing error messages during boot.
> >
> 
> This time, the patch is removing too many things that are correct. :)
> 
> see below to know what to remove and what to keep:
> 
> > Signed-off-by: Bibek Basu <bbasu@xxxxxxxxxx>
> > ---
> >  drivers/hid/i2c-hid/i2c-hid.c | 59
> > -------------------------------------------
> >  1 file changed, 59 deletions(-)
> >
> > diff --git a/drivers/hid/i2c-hid/i2c-hid.c
> > b/drivers/hid/i2c-hid/i2c-hid.c index fd7ce37..58a4f12 100644
> > --- a/drivers/hid/i2c-hid/i2c-hid.c
> > +++ b/drivers/hid/i2c-hid/i2c-hid.c
> > @@ -409,62 +409,6 @@ static int i2c_hid_get_report_length(struct
> hid_report *report)
> >                 report->device->report_enum[report->type].numbered +
> > 2;  }
> >
> > -static void i2c_hid_init_report(struct hid_report *report, u8 *buffer,
> > -       size_t bufsize)
> > -{
> > -       struct hid_device *hid = report->device;
> > -       struct i2c_client *client = hid->driver_data;
> > -       struct i2c_hid *ihid = i2c_get_clientdata(client);
> > -       unsigned int size, ret_size;
> > -
> > -       size = i2c_hid_get_report_length(report);
> > -       if (i2c_hid_get_report(client,
> > -                       report->type == HID_FEATURE_REPORT ? 0x03 : 0x01,
> > -                       report->id, buffer, size))
> > -               return;
> > -
> > -       i2c_hid_dbg(ihid, "report (len=%d): %*ph\n", size, size, ihid->inbuf);
> > -
> > -       ret_size = buffer[0] | (buffer[1] << 8);
> > -
> > -       if (ret_size != size) {
> > -               dev_err(&client->dev, "error in %s size:%d / ret_size:%d\n",
> > -                       __func__, size, ret_size);
> > -               return;
> > -       }
> > -
> > -       /* hid->driver_lock is held as we are in probe function,
> > -        * we just need to setup the input fields, so using
> > -        * hid_report_raw_event is safe. */
> > -       hid_report_raw_event(hid, report->type, buffer + 2, size - 2, 1);
> > -}
> 
> This function should be kept
> 
> > -
> > -/*
> > - * Initialize all reports
> > - */
> > -static void i2c_hid_init_reports(struct hid_device *hid) -{
> > -       struct hid_report *report;
> > -       struct i2c_client *client = hid->driver_data;
> > -       struct i2c_hid *ihid = i2c_get_clientdata(client);
> > -       u8 *inbuf = kzalloc(ihid->bufsize, GFP_KERNEL);
> > -
> > -       if (!inbuf) {
> > -               dev_err(&client->dev, "can not retrieve initial reports\n");
> > -               return;
> > -       }
> > -
> 
> Above should be kept
> 
> > -       list_for_each_entry(report,
> > -               &hid->report_enum[HID_INPUT_REPORT].report_list, list)
> > -               i2c_hid_init_report(report, inbuf, ihid->bufsize);
> > -
> 
> these for lines should be removed (they are the one giving the errors in the
> logs)
> 
> and please keep the rest of the code as is.
> 
> 
> > -       list_for_each_entry(report,
> > -               &hid->report_enum[HID_FEATURE_REPORT].report_list, list)
> > -               i2c_hid_init_report(report, inbuf, ihid->bufsize);
> 
> Actually, this part is very important because we have no spontaneous events
> emitted by features, so we don't know the value of the feature until we
> probed it. So please keep this part as mentioned above.

Thanks for the inputs. I am repushing  the patch. Unfortunately, looks like I need to upgrade the firmware of my HID keyboard, as it does not responds to the FEATURE_REPORT
query:(

regards
Bibek
> 
> Cheers,
> Benjamin
> 
> > -
> > -       kfree(inbuf);
> > -}
> > -
> >  /*
> >   * Traverse the supplied list of reports and find the longest
> >   */
> > @@ -683,9 +627,6 @@ static int i2c_hid_start(struct hid_device *hid)
> >                         return ret;
> >         }
> >
> > -       if (!(hid->quirks & HID_QUIRK_NO_INIT_REPORTS))
> > -               i2c_hid_init_reports(hid);
> > -
> >         return 0;
> >  }
> >
> > --
> > 1.8.1.5
> >
��.n��������+%������w��{.n�����{��)��^n�r������&��z�ޗ�zf���h���~����������_��+v���)ߣ�


[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux