Revision 68735b6c hw/usb-hid.c

b/hw/usb-hid.c
66 66
    int kind;
67 67
    int protocol;
68 68
    uint8_t idle;
69
    int64_t next_idle_clock;
69 70
    int changed;
70 71
    void *datain_opaque;
71 72
    void (*datain)(void *);
......
630 631
    s->protocol = 1;
631 632
}
632 633

  
634
static void usb_hid_set_next_idle(USBHIDState *s, int64_t curtime)
635
{
636
    s->next_idle_clock = curtime + (get_ticks_per_sec() * s->idle * 4) / 1000;
637
}
638

  
633 639
static int usb_hid_handle_control(USBDevice *dev, int request, int value,
634 640
                                  int index, int length, uint8_t *data)
635 641
{
......
795 801
        break;
796 802
    case SET_IDLE:
797 803
        s->idle = (uint8_t) (value >> 8);
804
        usb_hid_set_next_idle(s, qemu_get_clock(vm_clock));
798 805
        ret = 0;
799 806
        break;
800 807
    default:
......
813 820
    switch(p->pid) {
814 821
    case USB_TOKEN_IN:
815 822
        if (p->devep == 1) {
816
            /* TODO: Implement finite idle delays.  */
817
            if (!(s->changed || s->idle))
823
            int64_t curtime = qemu_get_clock(vm_clock);
824
            if (!s->changed && (!s->idle || s->next_idle_clock - curtime > 0))
818 825
                return USB_RET_NAK;
826
            usb_hid_set_next_idle(s, curtime);
819 827
            s->changed = 0;
820 828
            if (s->kind == USB_MOUSE)
821 829
                ret = usb_mouse_poll(s, p->data, p->len);

Also available in: Unified diff