bus.c 18 KB

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