Hi, first of all, your subject line is too long. Something like:
usb: gadget: hid: Add support for {GET,SET}_PROTOCOL
would've been enough
Abdulhadi Mohamed <[email protected]> writes:
> This patch is required to implement the set_procotol and get_procotol
> commands
> for HID gadgets to interact with the BIOS using the BOOT protocol according
> to
> the HID specification. These two commands are also required to implement
> remote
> wake up for HID gadgets once the BIOS takes control of the device.
>
> This issue was first raised by Golmer Palmer in May 25 2015 but was never
> followed
> up on. This version of the patch is also heavily based on the patch provided
> by
> Alan Stern with some added support for remote wakeup.
commit log needs to be broken at 72 characters.
> Abdul Mohamed
this is not how you sign a patch, although it's close. It needs to be:
Signed-off-by: Abdul Mohamed <[email protected]>
> diff --git a/drivers/usb/gadget/function/f_hid.c
> b/drivers/usb/gadget/function/f_hid.c
> index 5eea448..ea38e36 100644
> --- a/drivers/usb/gadget/function/f_hid.c
> +++ b/drivers/usb/gadget/function/f_hid.c
> @@ -44,6 +44,7 @@ struct f_hidg {
> /* configuration */
> unsigned char bInterfaceSubClass;
> unsigned char bInterfaceProtocol;
> + unsigned char protocol_is_report;
> unsigned short report_desc_length;
> char *report_desc;
> unsigned short report_length;
> @@ -338,10 +339,13 @@ static ssize_t f_hidg_write(struct file *file, const
> char __user *buffer,
> size_t count, loff_t *offp)
> {
> struct f_hidg *hidg = file->private_data;
> + struct usb_composite_dev *cdev = hidg->func.config->cdev;
why the tab here? Every other variable declaration is using one space
only. Just keep it consistent ;-)
> struct usb_request *req;
> unsigned long flags;
> ssize_t status = -ENOMEM;
>
> + usb_gadget_wakeup(cdev->gadget);
this seems unrelated to implemeting GET/SET_PROTOCOL. Why do you need this?
> @@ -528,6 +532,9 @@ static int hidg_setup(struct usb_function *f,
> | HID_REQ_GET_PROTOCOL):
> VDBG(cdev, "get_protocol\n");
> goto stall;
> + length = min_t(unsigned, length, 1);
> + ((u8 *) req->buf)[0] = hidg->protocol_is_report;
> + goto respond;
> break;
>
> case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8
> @@ -539,6 +546,17 @@ static int hidg_setup(struct usb_function *f,
> case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8
> | HID_REQ_SET_PROTOCOL):
> VDBG(cdev, "set_protocol\n");
> + if (value > 1)
why 1 here? Seems like this should be
USB_INTERFACE_PROTOCOL_KEYBOARD. And are you sure there's nobody using
this to emulate a mouse?
> + goto stall;
> + length = 0;
> + /*
> + * We assume that programs implementing the Boot protocol
> + * are also compatible with the Report protocol.
> + */
Why is this a safe assumption?
> + if(hidg->bInterfaceSubClass == USB_INTERFACE_SUBCLASS_BOOT) {
> + hidg->protocol_is_report = value;
> + goto respond;
wrong indentation.
> @@ -768,6 +786,7 @@ static int hidg_bind(struct usb_configuration *c, struct
> usb_function *f)
> /* set descriptor dynamic values */
> hidg_interface_desc.bInterfaceSubClass = hidg->bInterfaceSubClass;
> hidg_interface_desc.bInterfaceProtocol = hidg->bInterfaceProtocol;
> + hidg->protocol_is_report = 1;
no idea why you called this "protocol_is_report" when "protocol"
would've been better.
--
balbi
signature.asc
Description: PGP signature
