+       if (!(HIDInterfaceInfo->State.SupportsBootProtocol))\r
+         return HID_ERROR_LOGICAL;\r
+\r
+       if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)\r
+         return ErrorCode;\r
+\r
+       HIDInterfaceInfo->State.LargestReportSize = 8;\r
+       HIDInterfaceInfo->State.UsingBootProtocol = true;\r
+       \r
+       return HOST_SENDCONTROL_Successful;\r
+}\r
+\r
+#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY)\r
+uint8_t HID_Host_SetReportProtocol(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo)\r
+{\r
+       uint8_t ErrorCode;\r
+\r
+       uint8_t HIDReportData[HIDInterfaceInfo->State.HIDReportSize];\r
+       \r
+       USB_ControlRequest = (USB_Request_Header_t)\r
+               {\r
+                       .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_INTERFACE),\r
+                       .bRequest      = REQ_GetDescriptor,\r
+                       .wValue        = (DTYPE_Report << 8),\r
+                       .wIndex        = HIDInterfaceInfo->State.InterfaceNumber,\r
+                       .wLength       = HIDInterfaceInfo->State.HIDReportSize,\r
+               };\r
+\r
+       Pipe_SelectPipe(PIPE_CONTROLPIPE);\r
+\r
+       if ((ErrorCode = USB_Host_SendControlRequest(HIDReportData)) != HOST_SENDCONTROL_Successful)\r
+         return ErrorCode;\r
+         \r
+       if (HIDInterfaceInfo->State.UsingBootProtocol)\r
+       {\r
+               USB_ControlRequest = (USB_Request_Header_t)\r
+                       {\r
+                               .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),\r
+                               .bRequest      = REQ_SetProtocol,\r
+                               .wValue        = 1,\r
+                               .wIndex        = HIDInterfaceInfo->State.InterfaceNumber,\r
+                               .wLength       = 0,\r
+                       };\r
+\r
+               if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)\r
+                 return ErrorCode;\r
+\r
+               HIDInterfaceInfo->State.UsingBootProtocol = false;\r
+       }\r
+       \r
+       if (HIDInterfaceInfo->Config.HIDParserData == NULL)\r
+         return HID_ERROR_LOGICAL;\r
+               \r
+       if ((ErrorCode = USB_ProcessHIDReport(HIDReportData, HIDInterfaceInfo->State.HIDReportSize,\r
+                                             HIDInterfaceInfo->Config.HIDParserData)) != HID_PARSE_Successful)\r
+       {\r
+               return HID_ERROR_LOGICAL | ErrorCode;\r
+       }\r
+\r
+       uint8_t LargestReportSizeBits = HIDInterfaceInfo->Config.HIDParserData->LargestReportSizeBits;\r
+       HIDInterfaceInfo->State.LargestReportSize = (LargestReportSizeBits >> 3) + ((LargestReportSizeBits & 0x07) != 0);\r
+\r
+       return 0;\r