qemu/hw/usb/bus.c
<<
>>
Prefs
   1#include "qemu/osdep.h"
   2#include "hw/hw.h"
   3#include "hw/usb.h"
   4#include "hw/qdev.h"
   5#include "qapi/error.h"
   6#include "qemu/error-report.h"
   7#include "sysemu/sysemu.h"
   8#include "monitor/monitor.h"
   9#include "trace.h"
  10#include "qemu/cutils.h"
  11
  12static void usb_bus_dev_print(Monitor *mon, DeviceState *qdev, int indent);
  13
  14static char *usb_get_dev_path(DeviceState *dev);
  15static char *usb_get_fw_dev_path(DeviceState *qdev);
  16static void usb_qdev_unrealize(DeviceState *qdev, Error **errp);
  17
  18static Property usb_props[] = {
  19    DEFINE_PROP_STRING("port", USBDevice, port_path),
  20    DEFINE_PROP_STRING("serial", USBDevice, serial),
  21    DEFINE_PROP_BIT("full-path", USBDevice, flags,
  22                    USB_DEV_FLAG_FULL_PATH, true),
  23    DEFINE_PROP_BIT("msos-desc", USBDevice, flags,
  24                    USB_DEV_FLAG_MSOS_DESC_ENABLE, true),
  25    DEFINE_PROP_END_OF_LIST()
  26};
  27
  28static void usb_bus_class_init(ObjectClass *klass, void *data)
  29{
  30    BusClass *k = BUS_CLASS(klass);
  31    HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(klass);
  32
  33    k->print_dev = usb_bus_dev_print;
  34    k->get_dev_path = usb_get_dev_path;
  35    k->get_fw_dev_path = usb_get_fw_dev_path;
  36    hc->unplug = qdev_simple_device_unplug_cb;
  37}
  38
  39static const TypeInfo usb_bus_info = {
  40    .name = TYPE_USB_BUS,
  41    .parent = TYPE_BUS,
  42    .instance_size = sizeof(USBBus),
  43    .class_init = usb_bus_class_init,
  44    .interfaces = (InterfaceInfo[]) {
  45        { TYPE_HOTPLUG_HANDLER },
  46        { }
  47    }
  48};
  49
  50static int next_usb_bus = 0;
  51static QTAILQ_HEAD(, USBBus) busses = QTAILQ_HEAD_INITIALIZER(busses);
  52
  53static int usb_device_post_load(void *opaque, int version_id)
  54{
  55    USBDevice *dev = opaque;
  56
  57    if (dev->state == USB_STATE_NOTATTACHED) {
  58        dev->attached = 0;
  59    } else {
  60        dev->attached = 1;
  61    }
  62    if (dev->setup_index < 0 ||
  63        dev->setup_len < 0 ||
  64        dev->setup_index > dev->setup_len ||
  65        dev->setup_len > sizeof(dev->data_buf)) {
  66        return -EINVAL;
  67    }
  68    return 0;
  69}
  70
  71const VMStateDescription vmstate_usb_device = {
  72    .name = "USBDevice",
  73    .version_id = 1,
  74    .minimum_version_id = 1,
  75    .post_load = usb_device_post_load,
  76    .fields = (VMStateField[]) {
  77        VMSTATE_UINT8(addr, USBDevice),
  78        VMSTATE_INT32(state, USBDevice),
  79        VMSTATE_INT32(remote_wakeup, USBDevice),
  80        VMSTATE_INT32(setup_state, USBDevice),
  81        VMSTATE_INT32(setup_len, USBDevice),
  82        VMSTATE_INT32(setup_index, USBDevice),
  83        VMSTATE_UINT8_ARRAY(setup_buf, USBDevice, 8),
  84        VMSTATE_END_OF_LIST(),
  85    }
  86};
  87
  88void usb_bus_new(USBBus *bus, size_t bus_size,
  89                 USBBusOps *ops, DeviceState *host)
  90{
  91    qbus_create_inplace(bus, bus_size, TYPE_USB_BUS, host, NULL);
  92    qbus_set_bus_hotplug_handler(BUS(bus), &error_abort);
  93    bus->ops = ops;
  94    bus->busnr = next_usb_bus++;
  95    QTAILQ_INIT(&bus->free);
  96    QTAILQ_INIT(&bus->used);
  97    QTAILQ_INSERT_TAIL(&busses, bus, next);
  98}
  99
 100void usb_bus_release(USBBus *bus)
 101{
 102    assert(next_usb_bus > 0);
 103
 104    QTAILQ_REMOVE(&busses, bus, next);
 105}
 106
 107USBBus *usb_bus_find(int busnr)
 108{
 109    USBBus *bus;
 110
 111    if (-1 == busnr)
 112        return QTAILQ_FIRST(&busses);
 113    QTAILQ_FOREACH(bus, &busses, next) {
 114        if (bus->busnr == busnr)
 115            return bus;
 116    }
 117    return NULL;
 118}
 119
 120static void usb_device_realize(USBDevice *dev, Error **errp)
 121{
 122    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
 123
 124    if (klass->realize) {
 125        klass->realize(dev, errp);
 126    }
 127}
 128
 129USBDevice *usb_device_find_device(USBDevice *dev, uint8_t addr)
 130{
 131    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
 132    if (klass->find_device) {
 133        return klass->find_device(dev, addr);
 134    }
 135    return NULL;
 136}
 137
 138static void usb_device_handle_destroy(USBDevice *dev)
 139{
 140    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
 141    if (klass->handle_destroy) {
 142        klass->handle_destroy(dev);
 143    }
 144}
 145
 146void usb_device_cancel_packet(USBDevice *dev, USBPacket *p)
 147{
 148    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
 149    if (klass->cancel_packet) {
 150        klass->cancel_packet(dev, p);
 151    }
 152}
 153
 154void usb_device_handle_attach(USBDevice *dev)
 155{
 156    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
 157    if (klass->handle_attach) {
 158        klass->handle_attach(dev);
 159    }
 160}
 161
 162void usb_device_handle_reset(USBDevice *dev)
 163{
 164    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
 165    if (klass->handle_reset) {
 166        klass->handle_reset(dev);
 167    }
 168}
 169
 170void usb_device_handle_control(USBDevice *dev, USBPacket *p, int request,
 171                               int value, int index, int length, uint8_t *data)
 172{
 173    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
 174    if (klass->handle_control) {
 175        klass->handle_control(dev, p, request, value, index, length, data);
 176    }
 177}
 178
 179void usb_device_handle_data(USBDevice *dev, USBPacket *p)
 180{
 181    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
 182    if (klass->handle_data) {
 183        klass->handle_data(dev, p);
 184    }
 185}
 186
 187const char *usb_device_get_product_desc(USBDevice *dev)
 188{
 189    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
 190    return klass->product_desc;
 191}
 192
 193const USBDesc *usb_device_get_usb_desc(USBDevice *dev)
 194{
 195    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
 196    if (dev->usb_desc) {
 197        return dev->usb_desc;
 198    }
 199    return klass->usb_desc;
 200}
 201
 202void usb_device_set_interface(USBDevice *dev, int interface,
 203                              int alt_old, int alt_new)
 204{
 205    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
 206    if (klass->set_interface) {
 207        klass->set_interface(dev, interface, alt_old, alt_new);
 208    }
 209}
 210
 211void usb_device_flush_ep_queue(USBDevice *dev, USBEndpoint *ep)
 212{
 213    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
 214    if (klass->flush_ep_queue) {
 215        klass->flush_ep_queue(dev, ep);
 216    }
 217}
 218
 219void usb_device_ep_stopped(USBDevice *dev, USBEndpoint *ep)
 220{
 221    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
 222    if (klass->ep_stopped) {
 223        klass->ep_stopped(dev, ep);
 224    }
 225}
 226
 227int usb_device_alloc_streams(USBDevice *dev, USBEndpoint **eps, int nr_eps,
 228                             int streams)
 229{
 230    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
 231    if (klass->alloc_streams) {
 232        return klass->alloc_streams(dev, eps, nr_eps, streams);
 233    }
 234    return 0;
 235}
 236
 237void usb_device_free_streams(USBDevice *dev, USBEndpoint **eps, int nr_eps)
 238{
 239    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
 240    if (klass->free_streams) {
 241        klass->free_streams(dev, eps, nr_eps);
 242    }
 243}
 244
 245static void usb_qdev_realize(DeviceState *qdev, Error **errp)
 246{
 247    USBDevice *dev = USB_DEVICE(qdev);
 248    Error *local_err = NULL;
 249
 250    pstrcpy(dev->product_desc, sizeof(dev->product_desc),
 251            usb_device_get_product_desc(dev));
 252    dev->auto_attach = 1;
 253    QLIST_INIT(&dev->strings);
 254    usb_ep_init(dev);
 255
 256    usb_claim_port(dev, &local_err);
 257    if (local_err) {
 258        error_propagate(errp, local_err);
 259        return;
 260    }
 261
 262    usb_device_realize(dev, &local_err);
 263    if (local_err) {
 264        usb_release_port(dev);
 265        error_propagate(errp, local_err);
 266        return;
 267    }
 268
 269    if (dev->auto_attach) {
 270        usb_device_attach(dev, &local_err);
 271        if (local_err) {
 272            usb_qdev_unrealize(qdev, NULL);
 273            error_propagate(errp, local_err);
 274            return;
 275        }
 276    }
 277}
 278
 279static void usb_qdev_unrealize(DeviceState *qdev, Error **errp)
 280{
 281    USBDevice *dev = USB_DEVICE(qdev);
 282
 283    if (dev->attached) {
 284        usb_device_detach(dev);
 285    }
 286    usb_device_handle_destroy(dev);
 287    if (dev->port) {
 288        usb_release_port(dev);
 289    }
 290}
 291
 292typedef struct LegacyUSBFactory
 293{
 294    const char *name;
 295    const char *usbdevice_name;
 296    USBDevice *(*usbdevice_init)(USBBus *bus, const char *params);
 297} LegacyUSBFactory;
 298
 299static GSList *legacy_usb_factory;
 300
 301void usb_legacy_register(const char *typename, const char *usbdevice_name,
 302                         USBDevice *(*usbdevice_init)(USBBus *bus,
 303                                                      const char *params))
 304{
 305    if (usbdevice_name) {
 306        LegacyUSBFactory *f = g_malloc0(sizeof(*f));
 307        f->name = typename;
 308        f->usbdevice_name = usbdevice_name;
 309        f->usbdevice_init = usbdevice_init;
 310        legacy_usb_factory = g_slist_append(legacy_usb_factory, f);
 311    }
 312}
 313
 314USBDevice *usb_create(USBBus *bus, const char *name)
 315{
 316    DeviceState *dev;
 317
 318    dev = qdev_create(&bus->qbus, name);
 319    return USB_DEVICE(dev);
 320}
 321
 322static USBDevice *usb_try_create_simple(USBBus *bus, const char *name,
 323                                        Error **errp)
 324{
 325    Error *err = NULL;
 326    USBDevice *dev;
 327
 328    dev = USB_DEVICE(qdev_try_create(&bus->qbus, name));
 329    if (!dev) {
 330        error_setg(errp, "Failed to create USB device '%s'", name);
 331        return NULL;
 332    }
 333    object_property_set_bool(OBJECT(dev), true, "realized", &err);
 334    if (err) {
 335        error_propagate(errp, err);
 336        error_prepend(errp, "Failed to initialize USB device '%s': ",
 337                      name);
 338        object_unparent(OBJECT(dev));
 339        return NULL;
 340    }
 341    return dev;
 342}
 343
 344USBDevice *usb_create_simple(USBBus *bus, const char *name)
 345{
 346    return usb_try_create_simple(bus, name, &error_abort);
 347}
 348
 349static void usb_fill_port(USBPort *port, void *opaque, int index,
 350                          USBPortOps *ops, int speedmask)
 351{
 352    port->opaque = opaque;
 353    port->index = index;
 354    port->ops = ops;
 355    port->speedmask = speedmask;
 356    usb_port_location(port, NULL, index + 1);
 357}
 358
 359void usb_register_port(USBBus *bus, USBPort *port, void *opaque, int index,
 360                       USBPortOps *ops, int speedmask)
 361{
 362    usb_fill_port(port, opaque, index, ops, speedmask);
 363    QTAILQ_INSERT_TAIL(&bus->free, port, next);
 364    bus->nfree++;
 365}
 366
 367void usb_register_companion(const char *masterbus, USBPort *ports[],
 368                            uint32_t portcount, uint32_t firstport,
 369                            void *opaque, USBPortOps *ops, int speedmask,
 370                            Error **errp)
 371{
 372    USBBus *bus;
 373    int i;
 374
 375    QTAILQ_FOREACH(bus, &busses, next) {
 376        if (strcmp(bus->qbus.name, masterbus) == 0) {
 377            break;
 378        }
 379    }
 380
 381    if (!bus) {
 382        error_setg(errp, "USB bus '%s' not found", masterbus);
 383        return;
 384    }
 385    if (!bus->ops->register_companion) {
 386        error_setg(errp, "Can't use USB bus '%s' as masterbus,"
 387                   " it doesn't support companion controllers",
 388                   masterbus);
 389        return;
 390    }
 391
 392    for (i = 0; i < portcount; i++) {
 393        usb_fill_port(ports[i], opaque, i, ops, speedmask);
 394    }
 395
 396    bus->ops->register_companion(bus, ports, portcount, firstport, errp);
 397}
 398
 399void usb_port_location(USBPort *downstream, USBPort *upstream, int portnr)
 400{
 401    if (upstream) {
 402        snprintf(downstream->path, sizeof(downstream->path), "%s.%d",
 403                 upstream->path, portnr);
 404        downstream->hubcount = upstream->hubcount + 1;
 405    } else {
 406        snprintf(downstream->path, sizeof(downstream->path), "%d", portnr);
 407        downstream->hubcount = 0;
 408    }
 409}
 410
 411void usb_unregister_port(USBBus *bus, USBPort *port)
 412{
 413    if (port->dev) {
 414        object_unparent(OBJECT(port->dev));
 415    }
 416    QTAILQ_REMOVE(&bus->free, port, next);
 417    bus->nfree--;
 418}
 419
 420void usb_claim_port(USBDevice *dev, Error **errp)
 421{
 422    USBBus *bus = usb_bus_from_device(dev);
 423    USBPort *port;
 424
 425    assert(dev->port == NULL);
 426
 427    if (dev->port_path) {
 428        QTAILQ_FOREACH(port, &bus->free, next) {
 429            if (strcmp(port->path, dev->port_path) == 0) {
 430                break;
 431            }
 432        }
 433        if (port == NULL) {
 434            error_setg(errp, "usb port %s (bus %s) not found (in use?)",
 435                       dev->port_path, bus->qbus.name);
 436            return;
 437        }
 438    } else {
 439        if (bus->nfree == 1 && strcmp(object_get_typename(OBJECT(dev)), "usb-hub") != 0) {
 440            /* Create a new hub and chain it on */
 441            usb_try_create_simple(bus, "usb-hub", NULL);
 442        }
 443        if (bus->nfree == 0) {
 444            error_setg(errp, "tried to attach usb device %s to a bus "
 445                       "with no free ports", dev->product_desc);
 446            return;
 447        }
 448        port = QTAILQ_FIRST(&bus->free);
 449    }
 450    trace_usb_port_claim(bus->busnr, port->path);
 451
 452    QTAILQ_REMOVE(&bus->free, port, next);
 453    bus->nfree--;
 454
 455    dev->port = port;
 456    port->dev = dev;
 457
 458    QTAILQ_INSERT_TAIL(&bus->used, port, next);
 459    bus->nused++;
 460}
 461
 462void usb_release_port(USBDevice *dev)
 463{
 464    USBBus *bus = usb_bus_from_device(dev);
 465    USBPort *port = dev->port;
 466
 467    assert(port != NULL);
 468    trace_usb_port_release(bus->busnr, port->path);
 469
 470    QTAILQ_REMOVE(&bus->used, port, next);
 471    bus->nused--;
 472
 473    dev->port = NULL;
 474    port->dev = NULL;
 475
 476    QTAILQ_INSERT_TAIL(&bus->free, port, next);
 477    bus->nfree++;
 478}
 479
 480static void usb_mask_to_str(char *dest, size_t size,
 481                            unsigned int speedmask)
 482{
 483    static const struct {
 484        unsigned int mask;
 485        const char *name;
 486    } speeds[] = {
 487        { .mask = USB_SPEED_MASK_FULL,  .name = "full"  },
 488        { .mask = USB_SPEED_MASK_HIGH,  .name = "high"  },
 489        { .mask = USB_SPEED_MASK_SUPER, .name = "super" },
 490    };
 491    int i, pos = 0;
 492
 493    for (i = 0; i < ARRAY_SIZE(speeds); i++) {
 494        if (speeds[i].mask & speedmask) {
 495            pos += snprintf(dest + pos, size - pos, "%s%s",
 496                            pos ? "+" : "",
 497                            speeds[i].name);
 498        }
 499    }
 500}
 501
 502void usb_check_attach(USBDevice *dev, Error **errp)
 503{
 504    USBBus *bus = usb_bus_from_device(dev);
 505    USBPort *port = dev->port;
 506    char devspeed[32], portspeed[32];
 507
 508    assert(port != NULL);
 509    assert(!dev->attached);
 510    usb_mask_to_str(devspeed, sizeof(devspeed), dev->speedmask);
 511    usb_mask_to_str(portspeed, sizeof(portspeed), port->speedmask);
 512    trace_usb_port_attach(bus->busnr, port->path,
 513                          devspeed, portspeed);
 514
 515    if (!(port->speedmask & dev->speedmask)) {
 516        error_setg(errp, "Warning: speed mismatch trying to attach"
 517                   " usb device \"%s\" (%s speed)"
 518                   " to bus \"%s\", port \"%s\" (%s speed)",
 519                   dev->product_desc, devspeed,
 520                   bus->qbus.name, port->path, portspeed);
 521        return;
 522    }
 523}
 524
 525void usb_device_attach(USBDevice *dev, Error **errp)
 526{
 527    USBPort *port = dev->port;
 528    Error *local_err = NULL;
 529
 530    usb_check_attach(dev, &local_err);
 531    if (local_err) {
 532        error_propagate(errp, local_err);
 533        return;
 534    }
 535
 536    dev->attached++;
 537    usb_attach(port);
 538}
 539
 540int usb_device_detach(USBDevice *dev)
 541{
 542    USBBus *bus = usb_bus_from_device(dev);
 543    USBPort *port = dev->port;
 544
 545    assert(port != NULL);
 546    assert(dev->attached);
 547    trace_usb_port_detach(bus->busnr, port->path);
 548
 549    usb_detach(port);
 550    dev->attached--;
 551    return 0;
 552}
 553
 554int usb_device_delete_addr(int busnr, int addr)
 555{
 556    USBBus *bus;
 557    USBPort *port;
 558    USBDevice *dev;
 559
 560    bus = usb_bus_find(busnr);
 561    if (!bus)
 562        return -1;
 563
 564    QTAILQ_FOREACH(port, &bus->used, next) {
 565        if (port->dev->addr == addr)
 566            break;
 567    }
 568    if (!port)
 569        return -1;
 570    dev = port->dev;
 571
 572    object_unparent(OBJECT(dev));
 573    return 0;
 574}
 575
 576static const char *usb_speed(unsigned int speed)
 577{
 578    static const char *txt[] = {
 579        [ USB_SPEED_LOW  ] = "1.5",
 580        [ USB_SPEED_FULL ] = "12",
 581        [ USB_SPEED_HIGH ] = "480",
 582        [ USB_SPEED_SUPER ] = "5000",
 583    };
 584    if (speed >= ARRAY_SIZE(txt))
 585        return "?";
 586    return txt[speed];
 587}
 588
 589static void usb_bus_dev_print(Monitor *mon, DeviceState *qdev, int indent)
 590{
 591    USBDevice *dev = USB_DEVICE(qdev);
 592    USBBus *bus = usb_bus_from_device(dev);
 593
 594    monitor_printf(mon, "%*saddr %d.%d, port %s, speed %s, name %s%s\n",
 595                   indent, "", bus->busnr, dev->addr,
 596                   dev->port ? dev->port->path : "-",
 597                   usb_speed(dev->speed), dev->product_desc,
 598                   dev->attached ? ", attached" : "");
 599}
 600
 601static char *usb_get_dev_path(DeviceState *qdev)
 602{
 603    USBDevice *dev = USB_DEVICE(qdev);
 604    DeviceState *hcd = qdev->parent_bus->parent;
 605    char *id = NULL;
 606
 607    if (dev->flags & (1 << USB_DEV_FLAG_FULL_PATH)) {
 608        id = qdev_get_dev_path(hcd);
 609    }
 610    if (id) {
 611        char *ret = g_strdup_printf("%s/%s", id, dev->port->path);
 612        g_free(id);
 613        return ret;
 614    } else {
 615        return g_strdup(dev->port->path);
 616    }
 617}
 618
 619static char *usb_get_fw_dev_path(DeviceState *qdev)
 620{
 621    USBDevice *dev = USB_DEVICE(qdev);
 622    char *fw_path, *in;
 623    ssize_t pos = 0, fw_len;
 624    long nr;
 625
 626    fw_len = 32 + strlen(dev->port->path) * 6;
 627    fw_path = g_malloc(fw_len);
 628    in = dev->port->path;
 629    while (fw_len - pos > 0) {
 630        nr = strtol(in, &in, 10);
 631        if (in[0] == '.') {
 632            /* some hub between root port and device */
 633            pos += snprintf(fw_path + pos, fw_len - pos, "hub@%lx/", nr);
 634            in++;
 635        } else {
 636            /* the device itself */
 637            pos += snprintf(fw_path + pos, fw_len - pos, "%s@%lx",
 638                            qdev_fw_name(qdev), nr);
 639            break;
 640        }
 641    }
 642    return fw_path;
 643}
 644
 645void hmp_info_usb(Monitor *mon, const QDict *qdict)
 646{
 647    USBBus *bus;
 648    USBDevice *dev;
 649    USBPort *port;
 650
 651    if (QTAILQ_EMPTY(&busses)) {
 652        monitor_printf(mon, "USB support not enabled\n");
 653        return;
 654    }
 655
 656    QTAILQ_FOREACH(bus, &busses, next) {
 657        QTAILQ_FOREACH(port, &bus->used, next) {
 658            dev = port->dev;
 659            if (!dev)
 660                continue;
 661            monitor_printf(mon, "  Device %d.%d, Port %s, Speed %s Mb/s, "
 662                           "Product %s%s%s\n",
 663                           bus->busnr, dev->addr, port->path,
 664                           usb_speed(dev->speed), dev->product_desc,
 665                           dev->qdev.id ? ", ID: " : "",
 666                           dev->qdev.id ?: "");
 667        }
 668    }
 669}
 670
 671/* handle legacy -usbdevice cmd line option */
 672USBDevice *usbdevice_create(const char *cmdline)
 673{
 674    USBBus *bus = usb_bus_find(-1 /* any */);
 675    LegacyUSBFactory *f = NULL;
 676    Error *err = NULL;
 677    GSList *i;
 678    char driver[32];
 679    const char *params;
 680    int len;
 681    USBDevice *dev;
 682
 683    params = strchr(cmdline,':');
 684    if (params) {
 685        params++;
 686        len = params - cmdline;
 687        if (len > sizeof(driver))
 688            len = sizeof(driver);
 689        pstrcpy(driver, len, cmdline);
 690    } else {
 691        params = "";
 692        pstrcpy(driver, sizeof(driver), cmdline);
 693    }
 694
 695    for (i = legacy_usb_factory; i; i = i->next) {
 696        f = i->data;
 697        if (strcmp(f->usbdevice_name, driver) == 0) {
 698            break;
 699        }
 700    }
 701    if (i == NULL) {
 702#if 0
 703        /* no error because some drivers are not converted (yet) */
 704        error_report("usbdevice %s not found", driver);
 705#endif
 706        return NULL;
 707    }
 708
 709    if (!bus) {
 710        error_report("Error: no usb bus to attach usbdevice %s, "
 711                     "please try -machine usb=on and check that "
 712                     "the machine model supports USB", driver);
 713        return NULL;
 714    }
 715
 716    if (f->usbdevice_init) {
 717        dev = f->usbdevice_init(bus, params);
 718    } else {
 719        if (*params) {
 720            error_report("usbdevice %s accepts no params", driver);
 721            return NULL;
 722        }
 723        dev = usb_create(bus, f->name);
 724    }
 725    if (!dev) {
 726        error_report("Failed to create USB device '%s'", f->name);
 727        return NULL;
 728    }
 729    object_property_set_bool(OBJECT(dev), true, "realized", &err);
 730    if (err) {
 731        error_reportf_err(err, "Failed to initialize USB device '%s': ",
 732                          f->name);
 733        object_unparent(OBJECT(dev));
 734        return NULL;
 735    }
 736    return dev;
 737}
 738
 739static void usb_device_class_init(ObjectClass *klass, void *data)
 740{
 741    DeviceClass *k = DEVICE_CLASS(klass);
 742    k->bus_type = TYPE_USB_BUS;
 743    k->realize  = usb_qdev_realize;
 744    k->unrealize = usb_qdev_unrealize;
 745    k->props    = usb_props;
 746}
 747
 748static const TypeInfo usb_device_type_info = {
 749    .name = TYPE_USB_DEVICE,
 750    .parent = TYPE_DEVICE,
 751    .instance_size = sizeof(USBDevice),
 752    .abstract = true,
 753    .class_size = sizeof(USBDeviceClass),
 754    .class_init = usb_device_class_init,
 755};
 756
 757static void usb_register_types(void)
 758{
 759    type_register_static(&usb_bus_info);
 760    type_register_static(&usb_device_type_info);
 761}
 762
 763type_init(usb_register_types)
 764