From 9b37c351e804d5dd2ed8adbf4536e42d03eedf60 Mon Sep 17 00:00:00 2001 From: Peter Wu Date: Sun, 16 Mar 2014 12:02:45 +0100 Subject: usbdump: fix IN marking for non-control packets Non-control transfers have a meaningless setup buffer. Signed-off-by: Peter Wu --- hw/usb/dump.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'hw/usb/dump.c') 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; -- cgit v1.2.1