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 | } |