linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Benjamin Tissoires <benjamin.tissoires@gmail.com>
To: Antonio Ospite <ao2@ao2.it>
Cc: Benjamin Tissoires <benjamin.tissoires@redhat.com>,
	Jiri Kosina <jkosina@suse.cz>,
	David Herrmann <dh.herrmann@gmail.com>,
	David Barksdale <dbarksdale@uplogix.com>,
	linux-input <linux-input@vger.kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH 3/4] HID: sony: do not rely on hid_output_raw_report
Date: Mon, 3 Mar 2014 09:28:30 -0500	[thread overview]
Message-ID: <CAN+gG=Eap-S4K5rGhjHmnkxy=3kQ43aUBJJDwVcamgxJOjeLKg@mail.gmail.com> (raw)
In-Reply-To: <20140301131658.2168c54b91ade7a0a63d9fb6@ao2.it>

On Sat, Mar 1, 2014 at 7:16 AM, Antonio Ospite <ao2@ao2.it> wrote:
> Hi Benjamin,
>
> On Fri, 28 Feb 2014 19:20:36 -0500
> Benjamin Tissoires <benjamin.tissoires@redhat.com> wrote:
>
>> hid_out_raw_report is going to be obsoleted as it is not part of the
>> unified HID low level transport documentation
>> (Documentation/hid/hid-transport.txt)
>>
>> To do so, we need to introduce two new quirks:
>> * HID_QUIRK_NO_OUTPUT_REPORTS: this quirks prevents the transport
>>   driver to use the interrupt channel to send output report (and thus
>>   force to use HID_REQ_SET_REPORT command)
>
> Maybe a little more informative name? Like:
>         HID_QUIRK_NON_STD_OUTPUT_REPORTS
> or
>         HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP
> or expansions of the above.
>
> The rationale being that, from outside, these are still output reports
> (kind of), it's the channel they are sent over to which changes.

Sorry, putting names on things has always been my weakness. I like
more the second proposition, so I will pick it in the v2 unless
someone else complains.

>
> Another comment about a typo is inlined below.
>
> Thanks,
>    Antonio
>
>> * HID_QUIRK_SKIP_OUTPUT_REPORT_ID: this one forces usbhid to not
>>   include the report ID in the buffer it sends to the device through
>>   HID_REQ_SET_REPORT in case of an output report
>>
>> This also fixes a regression introduced in commit 3a75b24949a8
>> (HID: hidraw: replace hid_output_raw_report() calls by appropriates ones).
>> The hidraw API was not able to communicate with the PS3 SixAxis
>> controllers in USB mode.
>>
>> Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
>> ---
>>  drivers/hid/hid-sony.c        | 59 ++++++++++---------------------------------
>>  drivers/hid/hidraw.c          |  3 ++-
>>  drivers/hid/usbhid/hid-core.c |  7 ++++-
>>  include/linux/hid.h           |  2 ++
>>  4 files changed, 24 insertions(+), 47 deletions(-)
>>
>> diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c
>> index b5fe65e..08eac71 100644
>> --- a/drivers/hid/hid-sony.c
>> +++ b/drivers/hid/hid-sony.c
>> @@ -1007,45 +1007,6 @@ static int sony_mapping(struct hid_device *hdev, struct hid_input *hi,
>>  }
>>
>>  /*
>> - * The Sony Sixaxis does not handle HID Output Reports on the Interrupt EP
>> - * like it should according to usbhid/hid-core.c::usbhid_output_raw_report()
>> - * so we need to override that forcing HID Output Reports on the Control EP.
>> - *
>> - * There is also another issue about HID Output Reports via USB, the Sixaxis
>> - * does not want the report_id as part of the data packet, so we have to
>> - * discard buf[0] when sending the actual control message, even for numbered
>> - * reports, humpf!
>> - */
>> -static int sixaxis_usb_output_raw_report(struct hid_device *hid, __u8 *buf,
>> -             size_t count, unsigned char report_type)
>> -{
>> -     struct usb_interface *intf = to_usb_interface(hid->dev.parent);
>> -     struct usb_device *dev = interface_to_usbdev(intf);
>> -     struct usb_host_interface *interface = intf->cur_altsetting;
>> -     int report_id = buf[0];
>> -     int ret;
>> -
>> -     if (report_type == HID_OUTPUT_REPORT) {
>> -             /* Don't send the Report ID */
>> -             buf++;
>> -             count--;
>> -     }
>> -
>> -     ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
>> -             HID_REQ_SET_REPORT,
>> -             USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
>> -             ((report_type + 1) << 8) | report_id,
>> -             interface->desc.bInterfaceNumber, buf, count,
>> -             USB_CTRL_SET_TIMEOUT);
>> -
>> -     /* Count also the Report ID, in case of an Output report. */
>> -     if (ret > 0 && report_type == HID_OUTPUT_REPORT)
>> -             ret++;
>> -
>> -     return ret;
>> -}
>> -
>> -/*
>>   * Sending HID_REQ_GET_REPORT changes the operation mode of the ps3 controller
>>   * to "operational".  Without this, the ps3 controller will not report any
>>   * events.
>> @@ -1305,11 +1266,8 @@ static void sixaxis_state_worker(struct work_struct *work)
>>       buf[10] |= sc->led_state[2] << 3;
>>       buf[10] |= sc->led_state[3] << 4;
>>
>> -     if (sc->quirks & SIXAXIS_CONTROLLER_USB)
>> -             hid_output_raw_report(sc->hdev, buf, sizeof(buf), HID_OUTPUT_REPORT);
>> -     else
>> -             hid_hw_raw_request(sc->hdev, 0x01, buf, sizeof(buf),
>> -                             HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
>> +     hid_hw_raw_request(sc->hdev, 0x01, buf, sizeof(buf), HID_OUTPUT_REPORT,
>> +                     HID_REQ_SET_REPORT);
>>  }
>>
>>  static void dualshock4_state_worker(struct work_struct *work)
>> @@ -1659,7 +1617,18 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
>>       }
>>
>>       if (sc->quirks & SIXAXIS_CONTROLLER_USB) {
>> -             hdev->hid_output_raw_report = sixaxis_usb_output_raw_report;
>> +             /*
>> +              * The Sony Sixaxis does not handle HID Output Reports on the
>> +              * Interrupt EP like it could, so we need to forcing HID Output
>                                                              ^^^^
> typo: "we need to force".
>

k, will fix in v2.

Thanks,
Benjamin

>> +              * Reports to use HID_REQ_SET_REPORT on the Control EP.
>> +              *
>> +              * There is also another issue about HID Output Reports via USB,
>> +              * the Sixaxis does not want the report_id as part of the data
>> +              * packet, so we have to discard buf[0] when sending the actual
>> +              * control message, even for numbered reports, humpf!
>> +              */
>> +             hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS;
>> +             hdev->quirks |= HID_QUIRK_SKIP_OUTPUT_REPORT_ID;
>>               ret = sixaxis_set_operational_usb(hdev);
>>               sc->worker_initialized = 1;
>>               INIT_WORK(&sc->state_worker, sixaxis_state_worker);
>> diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c
>> index 2cc484c..6537e58 100644
>> --- a/drivers/hid/hidraw.c
>> +++ b/drivers/hid/hidraw.c
>> @@ -149,7 +149,8 @@ static ssize_t hidraw_send_report(struct file *file, const char __user *buffer,
>>               goto out_free;
>>       }
>>
>> -     if (report_type == HID_OUTPUT_REPORT) {
>> +     if ((report_type == HID_OUTPUT_REPORT) &&
>> +         !(dev->quirks & HID_QUIRK_NO_OUTPUT_REPORTS)) {
>>               ret = hid_hw_output_report(dev, buf, count);
>>               /*
>>                * compatibility with old implementation of USB-HID and I2C-HID:
>> diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
>> index 0d1d875..3bc7cad 100644
>> --- a/drivers/hid/usbhid/hid-core.c
>> +++ b/drivers/hid/usbhid/hid-core.c
>> @@ -894,7 +894,12 @@ static int usbhid_set_raw_report(struct hid_device *hid, unsigned int reportnum,
>>       int ret, skipped_report_id = 0;
>>
>>       /* Byte 0 is the report number. Report data starts at byte 1.*/
>> -     buf[0] = reportnum;
>> +     if ((rtype == HID_OUTPUT_REPORT) &&
>> +         (hid->quirks & HID_QUIRK_SKIP_OUTPUT_REPORT_ID))
>> +             buf[0] = 0;
>> +     else
>> +             buf[0] = reportnum;
>> +
>>       if (buf[0] == 0x0) {
>>               /* Don't send the Report ID */
>>               buf++;
>> diff --git a/include/linux/hid.h b/include/linux/hid.h
>> index 5eb282e..2baf834 100644
>> --- a/include/linux/hid.h
>> +++ b/include/linux/hid.h
>> @@ -287,6 +287,8 @@ struct hid_item {
>>  #define HID_QUIRK_NO_EMPTY_INPUT             0x00000100
>>  #define HID_QUIRK_NO_INIT_INPUT_REPORTS              0x00000200
>>  #define HID_QUIRK_SKIP_OUTPUT_REPORTS                0x00010000
>> +#define HID_QUIRK_SKIP_OUTPUT_REPORT_ID              0x00020000
>> +#define HID_QUIRK_NO_OUTPUT_REPORTS          0x00040000
>>  #define HID_QUIRK_FULLSPEED_INTERVAL         0x10000000
>>  #define HID_QUIRK_NO_INIT_REPORTS            0x20000000
>>  #define HID_QUIRK_NO_IGNORE                  0x40000000
>> --
>> 1.8.5.3
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-input" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>
> --
> Antonio Ospite
> http://ao2.it
>
> A: Because it messes up the order in which people normally read text.
>    See http://en.wikipedia.org/wiki/Posting_style
> Q: Why is top-posting such a bad thing?

  reply	other threads:[~2014-03-03 14:28 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-03-01  0:20 [PATCH 0/4] HID: ll transport cleanup: final round Benjamin Tissoires
2014-03-01  0:20 ` [PATCH 1/4] HID: cp2112: remove various hid_out_raw_report calls Benjamin Tissoires
2014-03-01  0:20 ` [PATCH 2/4] HID: cp2112: remove the last hid_output_raw_report() call Benjamin Tissoires
2014-03-04 13:46   ` Jiri Kosina
2014-03-04 14:18     ` Benjamin Tissoires
2014-03-04 14:21       ` Jiri Kosina
     [not found]       ` <ba12abe9-5f40-4351-8dc0-76008931fc0d@email.android.com>
2014-03-05 21:09         ` Benjamin Tissoires
2014-03-01  0:20 ` [PATCH 3/4] HID: sony: do not rely on hid_output_raw_report Benjamin Tissoires
2014-03-01 12:16   ` Antonio Ospite
2014-03-03 14:28     ` Benjamin Tissoires [this message]
2014-03-01  0:20 ` [PATCH 4/4] HID: remove hid_output_raw_report transport implementations Benjamin Tissoires

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAN+gG=Eap-S4K5rGhjHmnkxy=3kQ43aUBJJDwVcamgxJOjeLKg@mail.gmail.com' \
    --to=benjamin.tissoires@gmail.com \
    --cc=ao2@ao2.it \
    --cc=benjamin.tissoires@redhat.com \
    --cc=dbarksdale@uplogix.com \
    --cc=dh.herrmann@gmail.com \
    --cc=jkosina@suse.cz \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).