/* Submit a USB get HID report idle request for the USB device specified by UsbIo, Interface, and ReportId, and return the ide rate in Duration. If UsbIo is NULL, then ASSERT(). If Duration is NULL, then ASSERT(). */
EFI_STATUS EFIAPI UsbGetIdleRequest(IN EFI_USB_IO_PROTOCOL *UsbIo, IN UINT8 Interface, IN UINT8 ReportId, OUT UINT8 *Duration)
/* Submit a USB get HID report idle request for the USB device specified by UsbIo, Interface, and ReportId, and return the ide rate in Duration. If UsbIo is NULL, then ASSERT(). If Duration is NULL, then ASSERT(). */
EFI_STATUS EFIAPI UsbGetIdleRequest(IN EFI_USB_IO_PROTOCOL *UsbIo, IN UINT8 Interface, IN UINT8 ReportId, OUT UINT8 *Duration)
{
  UINT32                  Status;
  EFI_STATUS              Result;
  EFI_USB_DEVICE_REQUEST  Request;
  ASSERT (UsbIo != NULL);
  ASSERT (Duration != NULL);
  Request.RequestType = USB_HID_CLASS_GET_REQ_TYPE;
  Request.Request     = EFI_USB_GET_IDLE_REQUEST;
  Request.Value       = ReportId;
  Request.Index       = Interface;
  Request.Length      = 1;
  Result = UsbIo->UsbControlTransfer (
                    UsbIo,
                    &Request,
                    EfiUsbDataIn,
                    PcdGet32 (PcdUsbTransferTimeoutValue),
                    Duration,
                    1,
                    &Status
                    );
  return Result;
}