Add super speed descriptors to f_hid.

Signed-off-by: Janusz Dziedzic <januszx.dzied...@linux.intel.com>
---
 drivers/usb/gadget/function/f_hid.c | 67 ++++++++++++++++++++++++++++++++++++-
 1 file changed, 66 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/gadget/function/f_hid.c 
b/drivers/usb/gadget/function/f_hid.c
index e2966f8..7abd70b 100644
--- a/drivers/usb/gadget/function/f_hid.c
+++ b/drivers/usb/gadget/function/f_hid.c
@@ -98,6 +98,60 @@ static inline struct f_hidg *func_to_hidg(struct 
usb_function *f)
        /*.desc[0].wDescriptorLenght    = DYNAMIC */
 };
 
+/* Super-Speed Support */
+
+static struct usb_endpoint_descriptor hidg_ss_in_ep_desc = {
+       .bLength                = USB_DT_ENDPOINT_SIZE,
+       .bDescriptorType        = USB_DT_ENDPOINT,
+       .bEndpointAddress       = USB_DIR_IN,
+       .bmAttributes           = USB_ENDPOINT_XFER_INT,
+       /*.wMaxPacketSize       = DYNAMIC */
+       .bInterval              = 4, /* FIXME: Add this field in the
+                                     * HID gadget configuration?
+                                     * (struct hidg_func_descriptor)
+                                     */
+};
+
+static struct usb_ss_ep_comp_descriptor hidg_ss_in_comp_desc = {
+       .bLength                = sizeof(hidg_ss_in_comp_desc),
+       .bDescriptorType        = USB_DT_SS_ENDPOINT_COMP,
+
+       /* .bMaxBurst           = 0, */
+       /* .bmAttributes        = 0, */
+       /* .wBytesPerInterval   = DYNAMIC */
+};
+
+static struct usb_endpoint_descriptor hidg_ss_out_ep_desc = {
+       .bLength                = USB_DT_ENDPOINT_SIZE,
+       .bDescriptorType        = USB_DT_ENDPOINT,
+       .bEndpointAddress       = USB_DIR_OUT,
+       .bmAttributes           = USB_ENDPOINT_XFER_INT,
+       /*.wMaxPacketSize       = DYNAMIC */
+       .bInterval              = 4, /* FIXME: Add this field in the
+                                     * HID gadget configuration?
+                                     * (struct hidg_func_descriptor)
+                                     */
+};
+
+static struct usb_ss_ep_comp_descriptor hidg_ss_out_comp_desc = {
+       .bLength                = sizeof(hidg_ss_out_comp_desc),
+       .bDescriptorType        = USB_DT_SS_ENDPOINT_COMP,
+
+       /* .bMaxBurst           = 0, */
+       /* .bmAttributes        = 0, */
+       /* .wBytesPerInterval   = DYNAMIC */
+};
+
+static struct usb_descriptor_header *hidg_ss_descriptors[] = {
+       (struct usb_descriptor_header *)&hidg_interface_desc,
+       (struct usb_descriptor_header *)&hidg_desc,
+       (struct usb_descriptor_header *)&hidg_ss_in_ep_desc,
+       (struct usb_descriptor_header *)&hidg_ss_in_comp_desc,
+       (struct usb_descriptor_header *)&hidg_ss_out_ep_desc,
+       (struct usb_descriptor_header *)&hidg_ss_out_comp_desc,
+       NULL,
+};
+
 /* High-Speed Support */
 
 static struct usb_endpoint_descriptor hidg_hs_in_ep_desc = {
@@ -624,8 +678,14 @@ 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_ss_in_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length);
+       hidg_ss_in_comp_desc.wBytesPerInterval =
+                               cpu_to_le16(hidg->report_length);
        hidg_hs_in_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length);
        hidg_fs_in_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length);
+       hidg_ss_out_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length);
+       hidg_ss_out_comp_desc.wBytesPerInterval =
+                               cpu_to_le16(hidg->report_length);
        hidg_hs_out_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length);
        hidg_fs_out_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length);
        /*
@@ -641,8 +701,13 @@ static int hidg_bind(struct usb_configuration *c, struct 
usb_function *f)
        hidg_hs_out_ep_desc.bEndpointAddress =
                hidg_fs_out_ep_desc.bEndpointAddress;
 
+       hidg_ss_in_ep_desc.bEndpointAddress =
+               hidg_fs_in_ep_desc.bEndpointAddress;
+       hidg_ss_out_ep_desc.bEndpointAddress =
+               hidg_fs_out_ep_desc.bEndpointAddress;
+
        status = usb_assign_descriptors(f, hidg_fs_descriptors,
-                       hidg_hs_descriptors, NULL, NULL);
+                       hidg_hs_descriptors, hidg_ss_descriptors, NULL);
        if (status)
                goto fail;
 
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to