Commit 059809e45160fda714edf645902db95e262886e9
1 parent
3b2ccc57
usb destroy API change (Lonnie Mendez)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2066 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
7 changed files
with
48 additions
and
31 deletions
hw/usb-hid.c
| ... | ... | @@ -323,16 +323,10 @@ static int usb_tablet_poll(USBMouseState *s, uint8_t *buf, int len) |
| 323 | 323 | return l; |
| 324 | 324 | } |
| 325 | 325 | |
| 326 | -static void usb_mouse_handle_reset(USBDevice *dev, int destroy) | |
| 326 | +static void usb_mouse_handle_reset(USBDevice *dev) | |
| 327 | 327 | { |
| 328 | 328 | USBMouseState *s = (USBMouseState *)dev; |
| 329 | 329 | |
| 330 | - if (destroy) { | |
| 331 | - qemu_add_mouse_event_handler(NULL, NULL, 0); | |
| 332 | - qemu_free(s); | |
| 333 | - return; | |
| 334 | - } | |
| 335 | - | |
| 336 | 330 | s->dx = 0; |
| 337 | 331 | s->dy = 0; |
| 338 | 332 | s->dz = 0; |
| ... | ... | @@ -506,6 +500,14 @@ static int usb_mouse_handle_data(USBDevice *dev, int pid, |
| 506 | 500 | return ret; |
| 507 | 501 | } |
| 508 | 502 | |
| 503 | +static void usb_mouse_handle_destroy(USBDevice *dev) | |
| 504 | +{ | |
| 505 | + USBMouseState *s = (USBMouseState *)dev; | |
| 506 | + | |
| 507 | + qemu_add_mouse_event_handler(NULL, NULL, 0); | |
| 508 | + qemu_free(s); | |
| 509 | +} | |
| 510 | + | |
| 509 | 511 | USBDevice *usb_tablet_init(void) |
| 510 | 512 | { |
| 511 | 513 | USBMouseState *s; |
| ... | ... | @@ -519,6 +521,7 @@ USBDevice *usb_tablet_init(void) |
| 519 | 521 | s->dev.handle_reset = usb_mouse_handle_reset; |
| 520 | 522 | s->dev.handle_control = usb_mouse_handle_control; |
| 521 | 523 | s->dev.handle_data = usb_mouse_handle_data; |
| 524 | + s->dev.handle_destroy = usb_mouse_handle_destroy; | |
| 522 | 525 | s->kind = USB_TABLET; |
| 523 | 526 | |
| 524 | 527 | pstrcpy(s->dev.devname, sizeof(s->dev.devname), "QEMU USB Tablet"); |
| ... | ... | @@ -539,6 +542,7 @@ USBDevice *usb_mouse_init(void) |
| 539 | 542 | s->dev.handle_reset = usb_mouse_handle_reset; |
| 540 | 543 | s->dev.handle_control = usb_mouse_handle_control; |
| 541 | 544 | s->dev.handle_data = usb_mouse_handle_data; |
| 545 | + s->dev.handle_destroy = usb_mouse_handle_destroy; | |
| 542 | 546 | s->kind = USB_MOUSE; |
| 543 | 547 | |
| 544 | 548 | pstrcpy(s->dev.devname, sizeof(s->dev.devname), "QEMU USB Mouse"); | ... | ... |
hw/usb-hub.c
| ... | ... | @@ -199,11 +199,9 @@ static void usb_hub_attach(USBPort *port1, USBDevice *dev) |
| 199 | 199 | } |
| 200 | 200 | } |
| 201 | 201 | |
| 202 | -static void usb_hub_handle_reset(USBDevice *dev, int destroy) | |
| 202 | +static void usb_hub_handle_reset(USBDevice *dev) | |
| 203 | 203 | { |
| 204 | 204 | /* XXX: do it */ |
| 205 | - if (destroy) | |
| 206 | - qemu_free(dev); | |
| 207 | 205 | } |
| 208 | 206 | |
| 209 | 207 | static int usb_hub_handle_control(USBDevice *dev, int request, int value, |
| ... | ... | @@ -525,6 +523,13 @@ static int usb_hub_handle_packet(USBDevice *dev, int pid, |
| 525 | 523 | return usb_generic_handle_packet(dev, pid, devaddr, devep, data, len); |
| 526 | 524 | } |
| 527 | 525 | |
| 526 | +static void usb_hub_handle_destroy(USBDevice *dev) | |
| 527 | +{ | |
| 528 | + USBHubState *s = (USBHubState *)dev; | |
| 529 | + | |
| 530 | + qemu_free(s); | |
| 531 | +} | |
| 532 | + | |
| 528 | 533 | USBDevice *usb_hub_init(int nb_ports) |
| 529 | 534 | { |
| 530 | 535 | USBHubState *s; |
| ... | ... | @@ -543,6 +548,7 @@ USBDevice *usb_hub_init(int nb_ports) |
| 543 | 548 | s->dev.handle_reset = usb_hub_handle_reset; |
| 544 | 549 | s->dev.handle_control = usb_hub_handle_control; |
| 545 | 550 | s->dev.handle_data = usb_hub_handle_data; |
| 551 | + s->dev.handle_destroy = usb_hub_handle_destroy; | |
| 546 | 552 | |
| 547 | 553 | pstrcpy(s->dev.devname, sizeof(s->dev.devname), "QEMU USB Hub"); |
| 548 | 554 | ... | ... |
hw/usb-msd.c
| ... | ... | @@ -112,16 +112,12 @@ static void usb_msd_command_complete(void *opaque, uint32_t tag, int fail) |
| 112 | 112 | s->mode = USB_MSDM_CSW; |
| 113 | 113 | } |
| 114 | 114 | |
| 115 | -static void usb_msd_handle_reset(USBDevice *dev, int destroy) | |
| 115 | +static void usb_msd_handle_reset(USBDevice *dev) | |
| 116 | 116 | { |
| 117 | 117 | MSDState *s = (MSDState *)dev; |
| 118 | 118 | |
| 119 | 119 | DPRINTF("Reset\n"); |
| 120 | 120 | s->mode = USB_MSDM_CBW; |
| 121 | - if (destroy) { | |
| 122 | - scsi_disk_destroy(s->scsi_dev); | |
| 123 | - qemu_free(s); | |
| 124 | - } | |
| 125 | 121 | } |
| 126 | 122 | |
| 127 | 123 | static int usb_msd_handle_control(USBDevice *dev, int request, int value, |
| ... | ... | @@ -369,6 +365,13 @@ static int usb_msd_handle_data(USBDevice *dev, int pid, uint8_t devep, |
| 369 | 365 | return ret; |
| 370 | 366 | } |
| 371 | 367 | |
| 368 | +static void usb_msd_handle_destroy(USBDevice *dev) | |
| 369 | +{ | |
| 370 | + MSDState *s = (MSDState *)dev; | |
| 371 | + | |
| 372 | + scsi_disk_destroy(s->scsi_dev); | |
| 373 | + qemu_free(s); | |
| 374 | +} | |
| 372 | 375 | |
| 373 | 376 | USBDevice *usb_msd_init(const char *filename) |
| 374 | 377 | { |
| ... | ... | @@ -388,11 +391,12 @@ USBDevice *usb_msd_init(const char *filename) |
| 388 | 391 | s->dev.handle_reset = usb_msd_handle_reset; |
| 389 | 392 | s->dev.handle_control = usb_msd_handle_control; |
| 390 | 393 | s->dev.handle_data = usb_msd_handle_data; |
| 394 | + s->dev.handle_destroy = usb_msd_handle_destroy; | |
| 391 | 395 | |
| 392 | 396 | snprintf(s->dev.devname, sizeof(s->dev.devname), "QEMU USB MSD(%.16s)", |
| 393 | 397 | filename); |
| 394 | 398 | |
| 395 | 399 | s->scsi_dev = scsi_disk_init(bdrv, usb_msd_command_complete, s); |
| 396 | - usb_msd_handle_reset((USBDevice *)s, 0); | |
| 400 | + usb_msd_handle_reset((USBDevice *)s); | |
| 397 | 401 | return (USBDevice *)s; |
| 398 | 402 | } | ... | ... |
hw/usb.c
| ... | ... | @@ -55,10 +55,7 @@ int usb_generic_handle_packet(USBDevice *s, int pid, |
| 55 | 55 | s->remote_wakeup = 0; |
| 56 | 56 | s->addr = 0; |
| 57 | 57 | s->state = USB_STATE_DEFAULT; |
| 58 | - s->handle_reset(s, 0); | |
| 59 | - break; | |
| 60 | - case USB_MSG_DESTROY: | |
| 61 | - s->handle_reset(s, 1); | |
| 58 | + s->handle_reset(s); | |
| 62 | 59 | break; |
| 63 | 60 | case USB_TOKEN_SETUP: |
| 64 | 61 | if (s->state < USB_STATE_DEFAULT || devaddr != s->addr) | ... | ... |
hw/usb.h
| ... | ... | @@ -29,7 +29,6 @@ |
| 29 | 29 | #define USB_MSG_ATTACH 0x100 |
| 30 | 30 | #define USB_MSG_DETACH 0x101 |
| 31 | 31 | #define USB_MSG_RESET 0x102 |
| 32 | -#define USB_MSG_DESTROY 0x103 | |
| 33 | 32 | |
| 34 | 33 | #define USB_RET_NODEV (-1) |
| 35 | 34 | #define USB_RET_NAK (-2) |
| ... | ... | @@ -117,12 +116,14 @@ struct USBDevice { |
| 117 | 116 | int (*handle_packet)(USBDevice *dev, int pid, |
| 118 | 117 | uint8_t devaddr, uint8_t devep, |
| 119 | 118 | uint8_t *data, int len); |
| 119 | + void (*handle_destroy)(USBDevice *dev); | |
| 120 | + | |
| 120 | 121 | int speed; |
| 121 | 122 | |
| 122 | 123 | /* The following fields are used by the generic USB device |
| 123 | 124 | layer. They are here just to avoid creating a new structure for |
| 124 | 125 | them. */ |
| 125 | - void (*handle_reset)(USBDevice *dev, int destroy); | |
| 126 | + void (*handle_reset)(USBDevice *dev); | |
| 126 | 127 | int (*handle_control)(USBDevice *dev, int request, int value, |
| 127 | 128 | int index, int length, uint8_t *data); |
| 128 | 129 | int (*handle_data)(USBDevice *dev, int pid, uint8_t devep, | ... | ... |
usb-linux.c
| ... | ... | @@ -58,16 +58,8 @@ typedef struct USBHostDevice { |
| 58 | 58 | int fd; |
| 59 | 59 | } USBHostDevice; |
| 60 | 60 | |
| 61 | -static void usb_host_handle_reset(USBDevice *dev, int destroy) | |
| 61 | +static void usb_host_handle_reset(USBDevice *dev) | |
| 62 | 62 | { |
| 63 | - USBHostDevice *s = (USBHostDevice *)dev; | |
| 64 | - | |
| 65 | - if (destroy) { | |
| 66 | - if (s->fd >= 0) | |
| 67 | - close(s->fd); | |
| 68 | - qemu_free(s); | |
| 69 | - return; | |
| 70 | - } | |
| 71 | 63 | #if 0 |
| 72 | 64 | USBHostDevice *s = (USBHostDevice *)dev; |
| 73 | 65 | /* USBDEVFS_RESET, but not the first time as it has already be |
| ... | ... | @@ -76,6 +68,15 @@ static void usb_host_handle_reset(USBDevice *dev, int destroy) |
| 76 | 68 | #endif |
| 77 | 69 | } |
| 78 | 70 | |
| 71 | +static void usb_host_handle_destroy(USBDevice *dev) | |
| 72 | +{ | |
| 73 | + USBHostDevice *s = (USBHostDevice *)dev; | |
| 74 | + | |
| 75 | + if (s->fd >= 0) | |
| 76 | + close(s->fd); | |
| 77 | + qemu_free(s); | |
| 78 | +} | |
| 79 | + | |
| 79 | 80 | static int usb_host_handle_control(USBDevice *dev, |
| 80 | 81 | int request, |
| 81 | 82 | int value, |
| ... | ... | @@ -244,6 +245,7 @@ USBDevice *usb_host_device_open(const char *devname) |
| 244 | 245 | dev->dev.handle_reset = usb_host_handle_reset; |
| 245 | 246 | dev->dev.handle_control = usb_host_handle_control; |
| 246 | 247 | dev->dev.handle_data = usb_host_handle_data; |
| 248 | + dev->dev.handle_destroy = usb_host_handle_destroy; | |
| 247 | 249 | |
| 248 | 250 | if (product_name[0] == '\0') |
| 249 | 251 | snprintf(dev->dev.devname, sizeof(dev->dev.devname), | ... | ... |
vl.c
| ... | ... | @@ -3781,6 +3781,7 @@ static int usb_device_del(const char *devname) |
| 3781 | 3781 | { |
| 3782 | 3782 | USBPort *port; |
| 3783 | 3783 | USBPort **lastp; |
| 3784 | + USBDevice *dev; | |
| 3784 | 3785 | int bus_num, addr; |
| 3785 | 3786 | const char *p; |
| 3786 | 3787 | |
| ... | ... | @@ -3805,8 +3806,10 @@ static int usb_device_del(const char *devname) |
| 3805 | 3806 | if (!port) |
| 3806 | 3807 | return -1; |
| 3807 | 3808 | |
| 3809 | + dev = port->dev; | |
| 3808 | 3810 | *lastp = port->next; |
| 3809 | 3811 | usb_attach(port, NULL); |
| 3812 | + dev->handle_destroy(dev); | |
| 3810 | 3813 | port->next = free_usb_ports; |
| 3811 | 3814 | free_usb_ports = port; |
| 3812 | 3815 | return 0; | ... | ... |