Commit 181a29c5b2f5eacdc8c5fdf30bf46a04abedffde

Authored by aliguori
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: