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