From 232db7b0f138480202ce2bba4e69de5b0972c455 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 11 Jul 2014 14:20:53 +0200 Subject: [PATCH 19/43] usb: Add max_streams attribute to endpoint info Message-id: <1405088470-24115-21-git-send-email-kraxel@redhat.com> Patchwork-id: 59847 O-Subject: [RHEL-7.1 qemu-kvm PATCH 20/37] usb: Add max_streams attribute to endpoint info Bugzilla: 1111450 RH-Acked-by: Dr. David Alan Gilbert (git) RH-Acked-by: Miroslav Rezanina RH-Acked-by: Laszlo Ersek From: Hans de Goede Signed-off-by: Hans de Goede Signed-off-by: Gerd Hoffmann (cherry picked from commit 04b300f85fafd2d6a92ec0a766f0035e9bc5835c) --- hw/usb/core.c | 22 ++++++++++++++++++++++ hw/usb/desc.c | 2 ++ include/hw/usb.h | 3 +++ 3 files changed, 27 insertions(+) Signed-off-by: Miroslav Rezanina --- hw/usb/core.c | 22 ++++++++++++++++++++++ hw/usb/desc.c | 2 ++ include/hw/usb.h | 3 +++ 3 files changed, 27 insertions(+) diff --git a/hw/usb/core.c b/hw/usb/core.c index cf59a1a..67ba7d6 100644 --- a/hw/usb/core.c +++ b/hw/usb/core.c @@ -623,6 +623,7 @@ void usb_ep_reset(USBDevice *dev) dev->ep_ctl.type = USB_ENDPOINT_XFER_CONTROL; dev->ep_ctl.ifnum = 0; dev->ep_ctl.max_packet_size = 64; + dev->ep_ctl.max_streams = 0; dev->ep_ctl.dev = dev; dev->ep_ctl.pipeline = false; for (ep = 0; ep < USB_MAX_ENDPOINTS; ep++) { @@ -636,6 +637,8 @@ void usb_ep_reset(USBDevice *dev) dev->ep_out[ep].ifnum = USB_INTERFACE_INVALID; dev->ep_in[ep].max_packet_size = 0; dev->ep_out[ep].max_packet_size = 0; + dev->ep_in[ep].max_streams = 0; + dev->ep_out[ep].max_streams = 0; dev->ep_in[ep].dev = dev; dev->ep_out[ep].dev = dev; dev->ep_in[ep].pipeline = false; @@ -764,6 +767,25 @@ int usb_ep_get_max_packet_size(USBDevice *dev, int pid, int ep) return uep->max_packet_size; } +void usb_ep_set_max_streams(USBDevice *dev, int pid, int ep, uint8_t raw) +{ + struct USBEndpoint *uep = usb_ep_get(dev, pid, ep); + int MaxStreams; + + MaxStreams = raw & 0x1f; + if (MaxStreams) { + uep->max_streams = 1 << MaxStreams; + } else { + uep->max_streams = 0; + } +} + +int usb_ep_get_max_streams(USBDevice *dev, int pid, int ep) +{ + struct USBEndpoint *uep = usb_ep_get(dev, pid, ep); + return uep->max_streams; +} + void usb_ep_set_pipeline(USBDevice *dev, int pid, int ep, bool enabled) { struct USBEndpoint *uep = usb_ep_get(dev, pid, ep); diff --git a/hw/usb/desc.c b/hw/usb/desc.c index 5a954c6..f133ddb 100644 --- a/hw/usb/desc.c +++ b/hw/usb/desc.c @@ -385,6 +385,8 @@ static void usb_desc_ep_init(USBDevice *dev) usb_ep_set_ifnum(dev, pid, ep, iface->bInterfaceNumber); usb_ep_set_max_packet_size(dev, pid, ep, iface->eps[e].wMaxPacketSize); + usb_ep_set_max_streams(dev, pid, ep, + iface->eps[e].bmAttributes_super); } } } diff --git a/include/hw/usb.h b/include/hw/usb.h index 5668701..116293e 100644 --- a/include/hw/usb.h +++ b/include/hw/usb.h @@ -199,6 +199,7 @@ struct USBEndpoint { uint8_t type; uint8_t ifnum; int max_packet_size; + int max_streams; bool pipeline; bool halted; USBDevice *dev; @@ -433,6 +434,8 @@ void usb_ep_set_ifnum(USBDevice *dev, int pid, int ep, uint8_t ifnum); void usb_ep_set_max_packet_size(USBDevice *dev, int pid, int ep, uint16_t raw); int usb_ep_get_max_packet_size(USBDevice *dev, int pid, int ep); +void usb_ep_set_max_streams(USBDevice *dev, int pid, int ep, uint8_t raw); +int usb_ep_get_max_streams(USBDevice *dev, int pid, int ep); void usb_ep_set_pipeline(USBDevice *dev, int pid, int ep, bool enabled); void usb_ep_set_halted(USBDevice *dev, int pid, int ep, bool halted); USBPacket *usb_ep_find_packet_by_id(USBDevice *dev, int pid, int ep, -- 1.8.3.1