diff options
author | Peter Wu <peter@lekensteyn.nl> | 2014-03-16 12:02:45 +0100 |
---|---|---|
committer | Peter Wu <peter@lekensteyn.nl> | 2014-03-16 12:02:45 +0100 |
commit | 9b37c351e804d5dd2ed8adbf4536e42d03eedf60 (patch) | |
tree | a2ccbe707565d6e98d3482e4423b657faf9a0670 /hw/usb/dump.c | |
parent | 624bdf9fcccddc99072af39f2addcd310248254a (diff) | |
download | qemu-9b37c351e804d5dd2ed8adbf4536e42d03eedf60.tar.gz |
usbdump: fix IN marking for non-control packets
Non-control transfers have a meaningless setup buffer.
Signed-off-by: Peter Wu <peter@lekensteyn.nl>
Diffstat (limited to 'hw/usb/dump.c')
-rw-r--r-- | hw/usb/dump.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/hw/usb/dump.c b/hw/usb/dump.c index 4274508c73..672204d9c1 100644 --- a/hw/usb/dump.c +++ b/hw/usb/dump.c @@ -170,7 +170,13 @@ static void init_from_usbpacket(UsbDumpState *s, struct usbmon_packet *u, const USBPacket *p, char ev_type, unsigned datalen) { const USBDevice *dev = p->ep->dev; - bool is_data_in = dev->setup_buf[0] & USB_DIR_IN; + bool is_data_in; + + if (p->ep->type == USB_ENDPOINT_XFER_CONTROL) { + is_data_in = dev->setup_buf[0] & USB_DIR_IN; + } else { + is_data_in = p->pid == USB_TOKEN_IN; + } u->id = p->id; @@ -182,7 +188,7 @@ static void init_from_usbpacket(UsbDumpState *s, struct usbmon_packet *u, u->xfer_type = get_xfer_type_from_ep(p->ep); /* unsigned char - Endpoint number and transfer direction */ - u->epnum = (dev->setup_buf[0] & USB_DIR_IN) | p->ep->nr; + u->epnum = (is_data_in ? USB_DIR_IN : USB_DIR_OUT) | p->ep->nr; /* unsigned char - Device address */ u->devnum = dev->addr; |