Commit 24772c1edabb8bef3e74cd12da5c28c273d51153
1 parent
64838171
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 <maxk@kernel.org> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5052 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
6 additions
and
31 deletions
usb-linux.c
@@ -82,11 +82,10 @@ typedef struct USBHostDevice { | @@ -82,11 +82,10 @@ typedef struct USBHostDevice { | ||
82 | uint8_t descr[1024]; | 82 | uint8_t descr[1024]; |
83 | int descr_len; | 83 | int descr_len; |
84 | int configuration; | 84 | int configuration; |
85 | + int closing; | ||
85 | 86 | ||
86 | struct endp_data endp_table[MAX_ENDPOINTS]; | 87 | struct endp_data endp_table[MAX_ENDPOINTS]; |
87 | 88 | ||
88 | - QEMUTimer *timer; | ||
89 | - | ||
90 | /* Host side address */ | 89 | /* Host side address */ |
91 | int bus_num; | 90 | int bus_num; |
92 | int addr; | 91 | int addr; |
@@ -186,7 +185,7 @@ static void async_complete(void *opaque) | @@ -186,7 +185,7 @@ static void async_complete(void *opaque) | ||
186 | if (errno == EAGAIN) | 185 | if (errno == EAGAIN) |
187 | return; | 186 | return; |
188 | 187 | ||
189 | - if (errno == ENODEV) { | 188 | + if (errno == ENODEV && !s->closing) { |
190 | printf("husb: device %d.%d disconnected\n", s->bus_num, s->addr); | 189 | printf("husb: device %d.%d disconnected\n", s->bus_num, s->addr); |
191 | usb_device_del_addr(0, s->dev.addr); | 190 | usb_device_del_addr(0, s->dev.addr); |
192 | return; | 191 | return; |
@@ -328,7 +327,8 @@ static void usb_host_handle_destroy(USBDevice *dev) | @@ -328,7 +327,8 @@ static void usb_host_handle_destroy(USBDevice *dev) | ||
328 | { | 327 | { |
329 | USBHostDevice *s = (USBHostDevice *)dev; | 328 | USBHostDevice *s = (USBHostDevice *)dev; |
330 | 329 | ||
331 | - qemu_del_timer(s->timer); | 330 | + s->closing = 1; |
331 | + | ||
332 | qemu_set_fd_handler(s->fd, NULL, NULL, NULL); | 332 | qemu_set_fd_handler(s->fd, NULL, NULL, NULL); |
333 | 333 | ||
334 | hostdev_unlink(s); | 334 | hostdev_unlink(s); |
@@ -582,22 +582,6 @@ static int usb_linux_update_endp_table(USBHostDevice *s) | @@ -582,22 +582,6 @@ static int usb_linux_update_endp_table(USBHostDevice *s) | ||
582 | return 0; | 582 | return 0; |
583 | } | 583 | } |
584 | 584 | ||
585 | -static void usb_host_device_check(void *priv) | ||
586 | -{ | ||
587 | - USBHostDevice *s = priv; | ||
588 | - struct usbdevfs_connectinfo ci; | ||
589 | - int err; | ||
590 | - | ||
591 | - err = ioctl(s->fd, USBDEVFS_CONNECTINFO, &ci); | ||
592 | - if (err < 0) { | ||
593 | - printf("husb: device %d.%d disconnected\n", s->bus_num, s->addr); | ||
594 | - usb_device_del_addr(0, s->dev.addr); | ||
595 | - return; | ||
596 | - } | ||
597 | - | ||
598 | - qemu_mod_timer(s->timer, qemu_get_clock(rt_clock) + 1000); | ||
599 | -} | ||
600 | - | ||
601 | static USBDevice *usb_host_device_open_addr(int bus_num, int addr, const char *prod_name) | 585 | static USBDevice *usb_host_device_open_addr(int bus_num, int addr, const char *prod_name) |
602 | { | 586 | { |
603 | int fd = -1, ret; | 587 | int fd = -1, ret; |
@@ -612,10 +596,6 @@ static USBDevice *usb_host_device_open_addr(int bus_num, int addr, const char *p | @@ -612,10 +596,6 @@ static USBDevice *usb_host_device_open_addr(int bus_num, int addr, const char *p | ||
612 | dev->bus_num = bus_num; | 596 | dev->bus_num = bus_num; |
613 | dev->addr = addr; | 597 | dev->addr = addr; |
614 | 598 | ||
615 | - dev->timer = qemu_new_timer(rt_clock, usb_host_device_check, (void *) dev); | ||
616 | - if (!dev->timer) | ||
617 | - goto fail; | ||
618 | - | ||
619 | printf("husb: open device %d.%d\n", bus_num, addr); | 599 | printf("husb: open device %d.%d\n", bus_num, addr); |
620 | 600 | ||
621 | snprintf(buf, sizeof(buf), USBDEVFS_PATH "/%03d/%03d", | 601 | snprintf(buf, sizeof(buf), USBDEVFS_PATH "/%03d/%03d", |
@@ -683,19 +663,14 @@ static USBDevice *usb_host_device_open_addr(int bus_num, int addr, const char *p | @@ -683,19 +663,14 @@ static USBDevice *usb_host_device_open_addr(int bus_num, int addr, const char *p | ||
683 | /* USB devio uses 'write' flag to check for async completions */ | 663 | /* USB devio uses 'write' flag to check for async completions */ |
684 | qemu_set_fd_handler(dev->fd, NULL, async_complete, dev); | 664 | qemu_set_fd_handler(dev->fd, NULL, async_complete, dev); |
685 | 665 | ||
686 | - /* Start the timer to detect disconnect */ | ||
687 | - qemu_mod_timer(dev->timer, qemu_get_clock(rt_clock) + 1000); | ||
688 | - | ||
689 | hostdev_link(dev); | 666 | hostdev_link(dev); |
690 | 667 | ||
691 | return (USBDevice *) dev; | 668 | return (USBDevice *) dev; |
692 | 669 | ||
693 | fail: | 670 | fail: |
694 | - if (dev) { | ||
695 | - if (dev->timer) | ||
696 | - qemu_del_timer(dev->timer); | 671 | + if (dev) |
697 | qemu_free(dev); | 672 | qemu_free(dev); |
698 | - } | 673 | + |
699 | close(fd); | 674 | close(fd); |
700 | return NULL; | 675 | return NULL; |
701 | } | 676 | } |