Revision a8e662b5

b/hw/usb-bt.c
614 614
    s->hci->opaque = NULL;
615 615
    s->hci->evt_recv = NULL;
616 616
    s->hci->acl_recv = NULL;
617
    qemu_free(s);
618 617
}
619 618

  
620 619
static int usb_bt_initfn(USBDevice *dev)
b/hw/usb-bus.c
50 50
    return rc;
51 51
}
52 52

  
53
static int usb_qdev_exit(DeviceState *qdev)
54
{
55
    USBDevice *dev = DO_UPCAST(USBDevice, qdev, qdev);
56

  
57
    usb_device_detach(dev);
58
    if (dev->info->handle_destroy) {
59
        dev->info->handle_destroy(dev);
60
    }
61
    return 0;
62
}
63

  
53 64
void usb_qdev_register(USBDeviceInfo *info)
54 65
{
55 66
    info->qdev.bus_info = &usb_bus_info;
56 67
    info->qdev.init     = usb_qdev_init;
68
    info->qdev.exit     = usb_qdev_exit;
57 69
    qdev_register(&info->qdev);
58 70
}
59 71

  
......
101 113
    bus->nfree++;
102 114
}
103 115

  
116
void usb_unregister_port(USBBus *bus, USBPort *port)
117
{
118
    if (port->dev)
119
        qdev_free(&port->dev->qdev);
120
    QTAILQ_REMOVE(&bus->free, port, next);
121
    bus->nfree--;
122
}
123

  
104 124
static void do_attach(USBDevice *dev)
105 125
{
106 126
    USBBus *bus = usb_bus_from_device(dev);
......
136 156
    return 0;
137 157
}
138 158

  
159
int usb_device_detach(USBDevice *dev)
160
{
161
    USBBus *bus = usb_bus_from_device(dev);
162
    USBPort *port;
163

  
164
    if (!dev->attached) {
165
        fprintf(stderr, "Warning: tried to detach unattached usb device %s\n",
166
                dev->devname);
167
        return -1;
168
    }
169
    dev->attached--;
170

  
171
    QTAILQ_FOREACH(port, &bus->used, next) {
172
        if (port->dev == dev)
173
            break;
174
    }
175
    assert(port != NULL);
176

  
177
    QTAILQ_REMOVE(&bus->used, port, next);
178
    bus->nused--;
179

  
180
    usb_attach(port, NULL);
181

  
182
    QTAILQ_INSERT_TAIL(&bus->free, port, next);
183
    bus->nfree++;
184
    return 0;
185
}
186

  
139 187
int usb_device_delete_addr(int busnr, int addr)
140 188
{
141 189
    USBBus *bus;
......
152 200
    }
153 201
    if (!port)
154 202
        return -1;
155

  
156 203
    dev = port->dev;
157
    QTAILQ_REMOVE(&bus->used, port, next);
158
    bus->nused--;
159

  
160
    usb_attach(port, NULL);
161
    dev->info->handle_destroy(dev);
162 204

  
163
    QTAILQ_INSERT_TAIL(&bus->free, port, next);
164
    bus->nfree++;
205
    qdev_free(&dev->qdev);
165 206
    return 0;
166 207
}
167 208

  
b/hw/usb-hid.c
843 843
    if (s->kind != USB_KEYBOARD)
844 844
        qemu_remove_mouse_event_handler(s->ptr.eh_entry);
845 845
    /* TODO: else */
846
    qemu_free(s);
847 846
}
848 847

  
849 848
static int usb_hid_initfn(USBDevice *dev, int kind)
b/hw/usb-hub.c
517 517
static void usb_hub_handle_destroy(USBDevice *dev)
518 518
{
519 519
    USBHubState *s = (USBHubState *)dev;
520
    int i;
520 521

  
521
    qemu_free(s);
522
    for (i = 0; i < s->nb_ports; i++) {
523
        usb_unregister_port(usb_bus_from_device(dev),
524
                            &s->ports[i].port);
525
    }
522 526
}
523 527

  
524 528
static int usb_hub_initfn(USBDevice *dev)
b/hw/usb-msd.c
512 512
{
513 513
    MSDState *s = (MSDState *)dev;
514 514

  
515
    s->scsi_dev->info->destroy(s->scsi_dev);
516 515
    drive_uninit(s->dinfo->bdrv);
517
    qemu_free(s);
518 516
}
519 517

  
520 518
static int usb_msd_initfn(USBDevice *dev)
b/hw/usb-serial.c
486 486
    USBSerialState *s = (USBSerialState *)dev;
487 487

  
488 488
    qemu_chr_close(s->cs);
489
    qemu_free(s);
490 489
}
491 490

  
492 491
static int usb_serial_can_read(void *opaque)
b/hw/usb-wacom.c
389 389
    USBWacomState *s = (USBWacomState *) dev;
390 390

  
391 391
    qemu_remove_mouse_event_handler(s->eh_entry);
392
    qemu_free(s);
393 392
}
394 393

  
395 394
static int usb_wacom_initfn(USBDevice *dev)
b/hw/usb.h
311 311
USBDevice *usb_create_simple(USBBus *bus, const char *name);
312 312
void usb_register_port(USBBus *bus, USBPort *port, void *opaque, int index,
313 313
                       usb_attachfn attach);
314
void usb_unregister_port(USBBus *bus, USBPort *port);
314 315
int usb_device_attach(USBDevice *dev);
316
int usb_device_detach(USBDevice *dev);
315 317
int usb_device_delete_addr(int busnr, int addr);
316 318

  
317 319
static inline USBBus *usb_bus_from_device(USBDevice *d)

Also available in: Unified diff