2
0

bus.c 21 KB

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