bus.c 20 KB

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