usb setup state machine fix when driver reads or writes too many bytes

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1847 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
bellard 2006-04-24 21:10:52 +00:00
parent fd4a43e4e2
commit 56bebe70bd
1 changed files with 4 additions and 4 deletions

View File

@ -91,8 +91,8 @@ int usb_generic_handle_packet(USBDevice *s, int pid,
case 0: case 0:
switch(s->setup_state) { switch(s->setup_state) {
case SETUP_STATE_ACK: case SETUP_STATE_ACK:
s->setup_state = SETUP_STATE_IDLE;
if (!(s->setup_buf[0] & USB_DIR_IN)) { if (!(s->setup_buf[0] & USB_DIR_IN)) {
s->setup_state = SETUP_STATE_IDLE;
ret = s->handle_control(s, ret = s->handle_control(s,
(s->setup_buf[0] << 8) | s->setup_buf[1], (s->setup_buf[0] << 8) | s->setup_buf[1],
(s->setup_buf[3] << 8) | s->setup_buf[2], (s->setup_buf[3] << 8) | s->setup_buf[2],
@ -102,7 +102,7 @@ int usb_generic_handle_packet(USBDevice *s, int pid,
if (ret > 0) if (ret > 0)
ret = 0; ret = 0;
} else { } else {
goto fail; /* return 0 byte */
} }
break; break;
case SETUP_STATE_DATA: case SETUP_STATE_DATA:
@ -136,11 +136,11 @@ int usb_generic_handle_packet(USBDevice *s, int pid,
case 0: case 0:
switch(s->setup_state) { switch(s->setup_state) {
case SETUP_STATE_ACK: case SETUP_STATE_ACK:
s->setup_state = SETUP_STATE_IDLE;
if (s->setup_buf[0] & USB_DIR_IN) { if (s->setup_buf[0] & USB_DIR_IN) {
s->setup_state = SETUP_STATE_IDLE;
/* transfer OK */ /* transfer OK */
} else { } else {
goto fail; /* ignore additionnal output */
} }
break; break;
case SETUP_STATE_DATA: case SETUP_STATE_DATA: