Kaynağa Gözat

usb: Call wakeup when data becomes available for all devices with int eps

This is necessary for proper interaction with the xhci controller, and it
will allow other hcds to lower there frame timer while waiting for interrupt
data.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Hans de Goede 12 yıl önce
ebeveyn
işleme
8beba93043
4 değiştirilmiş dosya ile 17 ekleme ve 0 silme
  1. 2 0
      hw/usb/dev-hub.c
  2. 7 0
      hw/usb/dev-network.c
  3. 4 0
      hw/usb/dev-wacom.c
  4. 4 0
      hw/usb/redirect.c

+ 2 - 0
hw/usb/dev-hub.c

@@ -184,6 +184,7 @@ static void usb_hub_detach(USBPort *port1)
         port->wPortStatus &= ~PORT_STAT_ENABLE;
         port->wPortStatus &= ~PORT_STAT_ENABLE;
         port->wPortChange |= PORT_STAT_C_ENABLE;
         port->wPortChange |= PORT_STAT_C_ENABLE;
     }
     }
+    usb_wakeup(s->intr);
 }
 }
 
 
 static void usb_hub_child_detach(USBPort *port1, USBDevice *child)
 static void usb_hub_child_detach(USBPort *port1, USBDevice *child)
@@ -363,6 +364,7 @@ static void usb_hub_handle_control(USBDevice *dev, USBPacket *p,
                     port->wPortChange |= PORT_STAT_C_RESET;
                     port->wPortChange |= PORT_STAT_C_RESET;
                     /* set enable bit */
                     /* set enable bit */
                     port->wPortStatus |= PORT_STAT_ENABLE;
                     port->wPortStatus |= PORT_STAT_ENABLE;
+                    usb_wakeup(s->intr);
                 }
                 }
                 break;
                 break;
             case PORT_POWER:
             case PORT_POWER:

+ 7 - 0
hw/usb/dev-network.c

@@ -639,6 +639,8 @@ typedef struct USBNetState {
     unsigned int in_ptr, in_len;
     unsigned int in_ptr, in_len;
     uint8_t in_buf[2048];
     uint8_t in_buf[2048];
 
 
+    USBEndpoint *intr;
+
     char usbstring_mac[13];
     char usbstring_mac[13];
     NICState *nic;
     NICState *nic;
     NICConf conf;
     NICConf conf;
@@ -851,6 +853,10 @@ static void *rndis_queue_response(USBNetState *s, unsigned int length)
     struct rndis_response *r =
     struct rndis_response *r =
             g_malloc0(sizeof(struct rndis_response) + length);
             g_malloc0(sizeof(struct rndis_response) + length);
 
 
+    if (QTAILQ_EMPTY(&s->rndis_resp)) {
+        usb_wakeup(s->intr);
+    }
+
     QTAILQ_INSERT_TAIL(&s->rndis_resp, r, entries);
     QTAILQ_INSERT_TAIL(&s->rndis_resp, r, entries);
     r->length = length;
     r->length = length;
 
 
@@ -1349,6 +1355,7 @@ static int usb_net_initfn(USBDevice *dev)
     s->media_state = 0;	/* NDIS_MEDIA_STATE_CONNECTED */;
     s->media_state = 0;	/* NDIS_MEDIA_STATE_CONNECTED */;
     s->filter = 0;
     s->filter = 0;
     s->vendorid = 0x1234;
     s->vendorid = 0x1234;
+    s->intr = usb_ep_get(dev, USB_TOKEN_IN, 1);
 
 
     qemu_macaddr_default_if_unset(&s->conf.macaddr);
     qemu_macaddr_default_if_unset(&s->conf.macaddr);
     s->nic = qemu_new_nic(&net_usbnet_info, &s->conf,
     s->nic = qemu_new_nic(&net_usbnet_info, &s->conf,

+ 4 - 0
hw/usb/dev-wacom.c

@@ -43,6 +43,7 @@
 
 
 typedef struct USBWacomState {
 typedef struct USBWacomState {
     USBDevice dev;
     USBDevice dev;
+    USBEndpoint *intr;
     QEMUPutMouseEntry *eh_entry;
     QEMUPutMouseEntry *eh_entry;
     int dx, dy, dz, buttons_state;
     int dx, dy, dz, buttons_state;
     int x, y;
     int x, y;
@@ -137,6 +138,7 @@ static void usb_mouse_event(void *opaque,
     s->dz += dz1;
     s->dz += dz1;
     s->buttons_state = buttons_state;
     s->buttons_state = buttons_state;
     s->changed = 1;
     s->changed = 1;
+    usb_wakeup(s->intr);
 }
 }
 
 
 static void usb_wacom_event(void *opaque,
 static void usb_wacom_event(void *opaque,
@@ -150,6 +152,7 @@ static void usb_wacom_event(void *opaque,
     s->dz += dz;
     s->dz += dz;
     s->buttons_state = buttons_state;
     s->buttons_state = buttons_state;
     s->changed = 1;
     s->changed = 1;
+    usb_wakeup(s->intr);
 }
 }
 
 
 static inline int int_clamp(int val, int vmin, int vmax)
 static inline int int_clamp(int val, int vmin, int vmax)
@@ -337,6 +340,7 @@ static int usb_wacom_initfn(USBDevice *dev)
     USBWacomState *s = DO_UPCAST(USBWacomState, dev, dev);
     USBWacomState *s = DO_UPCAST(USBWacomState, dev, dev);
     usb_desc_create_serial(dev);
     usb_desc_create_serial(dev);
     usb_desc_init(dev);
     usb_desc_init(dev);
+    s->intr = usb_ep_get(dev, USB_TOKEN_IN, 1);
     s->changed = 1;
     s->changed = 1;
     return 0;
     return 0;
 }
 }

+ 4 - 0
hw/usb/redirect.c

@@ -1644,6 +1644,10 @@ static void usbredir_interrupt_packet(void *priv, uint64_t id,
             return;
             return;
         }
         }
 
 
+        if (QTAILQ_EMPTY(&dev->endpoint[EP2I(ep)].bufpq)) {
+            usb_wakeup(usb_ep_get(&dev->dev, USB_TOKEN_IN, ep & 0x0f));
+        }
+
         /* bufp_alloc also adds the packet to the ep queue */
         /* bufp_alloc also adds the packet to the ep queue */
         bufp_alloc(dev, data, data_len, interrupt_packet->status, ep);
         bufp_alloc(dev, data, data_len, interrupt_packet->status, ep);
     } else {
     } else {