Commit 181a29c5b2f5eacdc8c5fdf30bf46a04abedffde
1 parent
ef96779b
fix usb-hid SET_IDLE behaviour (Stefano Stabellini)
the usb-hid spec states that the SET_IDLE request has a 16bit value, where the upper byte specifies the idle rate (currently unimplemented, we handle only the 0 case, meaning infinite duration) and the lower byte specifies the report id (0 means all reports). In our code we do idle = value, while it should be idle = "upper byte", especially if the guest issues a GET_IDLE, we should return only the idle rate while we are returning only the report id. In practice it doesn't make much difference because I have only seen SET_VALUE with both bytes set to 0 so far, but still it is wrong. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6211 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
2 additions
and
2 deletions
hw/usb-hid.c
@@ -65,7 +65,7 @@ typedef struct USBHIDState { | @@ -65,7 +65,7 @@ typedef struct USBHIDState { | ||
65 | }; | 65 | }; |
66 | int kind; | 66 | int kind; |
67 | int protocol; | 67 | int protocol; |
68 | - int idle; | 68 | + uint8_t idle; |
69 | int changed; | 69 | int changed; |
70 | void *datain_opaque; | 70 | void *datain_opaque; |
71 | void (*datain)(void *); | 71 | void (*datain)(void *); |
@@ -794,7 +794,7 @@ static int usb_hid_handle_control(USBDevice *dev, int request, int value, | @@ -794,7 +794,7 @@ static int usb_hid_handle_control(USBDevice *dev, int request, int value, | ||
794 | data[0] = s->idle; | 794 | data[0] = s->idle; |
795 | break; | 795 | break; |
796 | case SET_IDLE: | 796 | case SET_IDLE: |
797 | - s->idle = value; | 797 | + s->idle = (uint8_t) (value >> 8); |
798 | ret = 0; | 798 | ret = 0; |
799 | break; | 799 | break; |
800 | default: | 800 | default: |