qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [5052] husb: remove disconnect detection timer (Max Krasnya


From: Anthony Liguori
Subject: [Qemu-devel] [5052] husb: remove disconnect detection timer (Max Krasnyansky)
Date: Thu, 21 Aug 2008 19:31:53 +0000

Revision: 5052
          http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=5052
Author:   aliguori
Date:     2008-08-21 19:31:52 +0000 (Thu, 21 Aug 2008)

Log Message:
-----------
husb: remove disconnect detection timer (Max Krasnyansky)

On top of my previous USB patchset.

Async completion handler can detect device disconnects without polling.
We do not need the timer anymore.

Signed-off-by: Max Krasnyansky <address@hidden>
Signed-off-by: Anthony Liguori <address@hidden>

Modified Paths:
--------------
    trunk/usb-linux.c

Modified: trunk/usb-linux.c
===================================================================
--- trunk/usb-linux.c   2008-08-21 19:31:10 UTC (rev 5051)
+++ trunk/usb-linux.c   2008-08-21 19:31:52 UTC (rev 5052)
@@ -82,11 +82,10 @@
     uint8_t   descr[1024];
     int       descr_len;
     int       configuration;
+    int       closing;
 
     struct endp_data endp_table[MAX_ENDPOINTS];
 
-    QEMUTimer *timer;
-
     /* Host side address */
     int bus_num;
     int addr;
@@ -186,7 +185,7 @@
             if (errno == EAGAIN)
                 return;
 
-            if (errno == ENODEV) {
+            if (errno == ENODEV && !s->closing) {
                 printf("husb: device %d.%d disconnected\n", s->bus_num, 
s->addr);
                usb_device_del_addr(0, s->dev.addr);
                 return;
@@ -328,7 +327,8 @@
 {
     USBHostDevice *s = (USBHostDevice *)dev;
 
-    qemu_del_timer(s->timer);
+    s->closing = 1;
+
     qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
 
     hostdev_unlink(s);
@@ -582,22 +582,6 @@
     return 0;
 }
 
-static void usb_host_device_check(void *priv)
-{
-    USBHostDevice *s = priv;
-    struct usbdevfs_connectinfo ci;
-    int err;
-
-    err = ioctl(s->fd, USBDEVFS_CONNECTINFO, &ci);
-    if (err < 0) {
-        printf("husb: device %d.%d disconnected\n", s->bus_num, s->addr);
-       usb_device_del_addr(0, s->dev.addr);
-       return;
-    }
-
-    qemu_mod_timer(s->timer, qemu_get_clock(rt_clock) + 1000);
-}
-
 static USBDevice *usb_host_device_open_addr(int bus_num, int addr, const char 
*prod_name)
 {
     int fd = -1, ret;
@@ -612,10 +596,6 @@
     dev->bus_num = bus_num;
     dev->addr = addr;
 
-    dev->timer = qemu_new_timer(rt_clock, usb_host_device_check, (void *) dev);
-    if (!dev->timer)
-       goto fail;
-
     printf("husb: open device %d.%d\n", bus_num, addr);
 
     snprintf(buf, sizeof(buf), USBDEVFS_PATH "/%03d/%03d",
@@ -683,19 +663,14 @@
     /* USB devio uses 'write' flag to check for async completions */
     qemu_set_fd_handler(dev->fd, NULL, async_complete, dev);
 
-    /* Start the timer to detect disconnect */
-    qemu_mod_timer(dev->timer, qemu_get_clock(rt_clock) + 1000);
-
     hostdev_link(dev);
 
     return (USBDevice *) dev;
 
 fail:
-    if (dev) {
-       if (dev->timer)
-               qemu_del_timer(dev->timer);
+    if (dev)
         qemu_free(dev);
-    }
+
     close(fd);
     return NULL;
 }






reply via email to

[Prev in Thread] Current Thread [Next in Thread]