usb-bus.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482
  1. #include "hw.h"
  2. #include "usb.h"
  3. #include "qdev.h"
  4. #include "sysemu.h"
  5. #include "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 struct BusInfo usb_bus_info = {
  12. .name = "USB",
  13. .size = sizeof(USBBus),
  14. .print_dev = usb_bus_dev_print,
  15. .get_dev_path = usb_get_dev_path,
  16. .get_fw_dev_path = usb_get_fw_dev_path,
  17. .props = (Property[]) {
  18. DEFINE_PROP_STRING("port", USBDevice, port_path),
  19. DEFINE_PROP_END_OF_LIST()
  20. },
  21. };
  22. static int next_usb_bus = 0;
  23. static QTAILQ_HEAD(, USBBus) busses = QTAILQ_HEAD_INITIALIZER(busses);
  24. const VMStateDescription vmstate_usb_device = {
  25. .name = "USBDevice",
  26. .version_id = 1,
  27. .minimum_version_id = 1,
  28. .fields = (VMStateField []) {
  29. VMSTATE_UINT8(addr, USBDevice),
  30. VMSTATE_INT32(state, USBDevice),
  31. VMSTATE_INT32(remote_wakeup, USBDevice),
  32. VMSTATE_INT32(setup_state, USBDevice),
  33. VMSTATE_INT32(setup_len, USBDevice),
  34. VMSTATE_INT32(setup_index, USBDevice),
  35. VMSTATE_UINT8_ARRAY(setup_buf, USBDevice, 8),
  36. VMSTATE_END_OF_LIST(),
  37. }
  38. };
  39. void usb_bus_new(USBBus *bus, USBBusOps *ops, DeviceState *host)
  40. {
  41. qbus_create_inplace(&bus->qbus, &usb_bus_info, host, NULL);
  42. bus->ops = ops;
  43. bus->busnr = next_usb_bus++;
  44. bus->qbus.allow_hotplug = 1; /* Yes, we can */
  45. QTAILQ_INIT(&bus->free);
  46. QTAILQ_INIT(&bus->used);
  47. QTAILQ_INSERT_TAIL(&busses, bus, next);
  48. }
  49. USBBus *usb_bus_find(int busnr)
  50. {
  51. USBBus *bus;
  52. if (-1 == busnr)
  53. return QTAILQ_FIRST(&busses);
  54. QTAILQ_FOREACH(bus, &busses, next) {
  55. if (bus->busnr == busnr)
  56. return bus;
  57. }
  58. return NULL;
  59. }
  60. static int usb_qdev_init(DeviceState *qdev, DeviceInfo *base)
  61. {
  62. USBDevice *dev = DO_UPCAST(USBDevice, qdev, qdev);
  63. USBDeviceInfo *info = DO_UPCAST(USBDeviceInfo, qdev, base);
  64. int rc;
  65. pstrcpy(dev->product_desc, sizeof(dev->product_desc), info->product_desc);
  66. dev->info = info;
  67. dev->auto_attach = 1;
  68. QLIST_INIT(&dev->strings);
  69. rc = usb_claim_port(dev);
  70. if (rc != 0) {
  71. goto err;
  72. }
  73. rc = dev->info->init(dev);
  74. if (rc != 0) {
  75. goto err;
  76. }
  77. if (dev->auto_attach) {
  78. rc = usb_device_attach(dev);
  79. if (rc != 0) {
  80. goto err;
  81. }
  82. }
  83. return 0;
  84. err:
  85. usb_qdev_exit(qdev);
  86. return rc;
  87. }
  88. static int usb_qdev_exit(DeviceState *qdev)
  89. {
  90. USBDevice *dev = DO_UPCAST(USBDevice, qdev, qdev);
  91. if (dev->attached) {
  92. usb_device_detach(dev);
  93. }
  94. if (dev->info->handle_destroy) {
  95. dev->info->handle_destroy(dev);
  96. }
  97. if (dev->port) {
  98. usb_release_port(dev);
  99. }
  100. return 0;
  101. }
  102. void usb_qdev_register(USBDeviceInfo *info)
  103. {
  104. info->qdev.bus_info = &usb_bus_info;
  105. info->qdev.init = usb_qdev_init;
  106. info->qdev.unplug = qdev_simple_unplug_cb;
  107. info->qdev.exit = usb_qdev_exit;
  108. qdev_register(&info->qdev);
  109. }
  110. void usb_qdev_register_many(USBDeviceInfo *info)
  111. {
  112. while (info->qdev.name) {
  113. usb_qdev_register(info);
  114. info++;
  115. }
  116. }
  117. USBDevice *usb_create(USBBus *bus, const char *name)
  118. {
  119. DeviceState *dev;
  120. #if 1
  121. /* temporary stopgap until all usb is properly qdev-ified */
  122. if (!bus) {
  123. bus = usb_bus_find(-1);
  124. if (!bus)
  125. return NULL;
  126. error_report("%s: no bus specified, using \"%s\" for \"%s\"\n",
  127. __FUNCTION__, bus->qbus.name, name);
  128. }
  129. #endif
  130. dev = qdev_create(&bus->qbus, name);
  131. return DO_UPCAST(USBDevice, qdev, dev);
  132. }
  133. USBDevice *usb_create_simple(USBBus *bus, const char *name)
  134. {
  135. USBDevice *dev = usb_create(bus, name);
  136. int rc;
  137. if (!dev) {
  138. error_report("Failed to create USB device '%s'\n", name);
  139. return NULL;
  140. }
  141. rc = qdev_init(&dev->qdev);
  142. if (rc < 0) {
  143. error_report("Failed to initialize USB device '%s'\n", name);
  144. return NULL;
  145. }
  146. return dev;
  147. }
  148. static void usb_fill_port(USBPort *port, void *opaque, int index,
  149. USBPortOps *ops, int speedmask)
  150. {
  151. port->opaque = opaque;
  152. port->index = index;
  153. port->ops = ops;
  154. port->speedmask = speedmask;
  155. usb_port_location(port, NULL, index + 1);
  156. }
  157. void usb_register_port(USBBus *bus, USBPort *port, void *opaque, int index,
  158. USBPortOps *ops, int speedmask)
  159. {
  160. usb_fill_port(port, opaque, index, ops, speedmask);
  161. QTAILQ_INSERT_TAIL(&bus->free, port, next);
  162. bus->nfree++;
  163. }
  164. int usb_register_companion(const char *masterbus, USBPort *ports[],
  165. uint32_t portcount, uint32_t firstport,
  166. void *opaque, USBPortOps *ops, int speedmask)
  167. {
  168. USBBus *bus;
  169. int i;
  170. QTAILQ_FOREACH(bus, &busses, next) {
  171. if (strcmp(bus->qbus.name, masterbus) == 0) {
  172. break;
  173. }
  174. }
  175. if (!bus || !bus->ops->register_companion) {
  176. qerror_report(QERR_INVALID_PARAMETER_VALUE, "masterbus",
  177. "an USB masterbus");
  178. if (bus) {
  179. error_printf_unless_qmp(
  180. "USB bus '%s' does not allow companion controllers\n",
  181. masterbus);
  182. }
  183. return -1;
  184. }
  185. for (i = 0; i < portcount; i++) {
  186. usb_fill_port(ports[i], opaque, i, ops, speedmask);
  187. }
  188. return bus->ops->register_companion(bus, ports, portcount, firstport);
  189. }
  190. void usb_port_location(USBPort *downstream, USBPort *upstream, int portnr)
  191. {
  192. if (upstream) {
  193. snprintf(downstream->path, sizeof(downstream->path), "%s.%d",
  194. upstream->path, portnr);
  195. } else {
  196. snprintf(downstream->path, sizeof(downstream->path), "%d", portnr);
  197. }
  198. }
  199. void usb_unregister_port(USBBus *bus, USBPort *port)
  200. {
  201. if (port->dev)
  202. qdev_free(&port->dev->qdev);
  203. QTAILQ_REMOVE(&bus->free, port, next);
  204. bus->nfree--;
  205. }
  206. int usb_claim_port(USBDevice *dev)
  207. {
  208. USBBus *bus = usb_bus_from_device(dev);
  209. USBPort *port;
  210. assert(dev->port == NULL);
  211. if (dev->port_path) {
  212. QTAILQ_FOREACH(port, &bus->free, next) {
  213. if (strcmp(port->path, dev->port_path) == 0) {
  214. break;
  215. }
  216. }
  217. if (port == NULL) {
  218. error_report("Error: usb port %s (bus %s) not found (in use?)\n",
  219. dev->port_path, bus->qbus.name);
  220. return -1;
  221. }
  222. } else {
  223. if (bus->nfree == 1 && strcmp(dev->qdev.info->name, "usb-hub") != 0) {
  224. /* Create a new hub and chain it on */
  225. usb_create_simple(bus, "usb-hub");
  226. }
  227. if (bus->nfree == 0) {
  228. error_report("Error: tried to attach usb device %s to a bus "
  229. "with no free ports\n", dev->product_desc);
  230. return -1;
  231. }
  232. port = QTAILQ_FIRST(&bus->free);
  233. }
  234. trace_usb_port_claim(bus->busnr, port->path);
  235. QTAILQ_REMOVE(&bus->free, port, next);
  236. bus->nfree--;
  237. dev->port = port;
  238. port->dev = dev;
  239. QTAILQ_INSERT_TAIL(&bus->used, port, next);
  240. bus->nused++;
  241. return 0;
  242. }
  243. void usb_release_port(USBDevice *dev)
  244. {
  245. USBBus *bus = usb_bus_from_device(dev);
  246. USBPort *port = dev->port;
  247. assert(port != NULL);
  248. trace_usb_port_release(bus->busnr, port->path);
  249. QTAILQ_REMOVE(&bus->used, port, next);
  250. bus->nused--;
  251. dev->port = NULL;
  252. port->dev = NULL;
  253. QTAILQ_INSERT_TAIL(&bus->free, port, next);
  254. bus->nfree++;
  255. }
  256. int usb_device_attach(USBDevice *dev)
  257. {
  258. USBBus *bus = usb_bus_from_device(dev);
  259. USBPort *port = dev->port;
  260. assert(port != NULL);
  261. assert(!dev->attached);
  262. trace_usb_port_attach(bus->busnr, port->path);
  263. if (!(port->speedmask & dev->speedmask)) {
  264. error_report("Warning: speed mismatch trying to attach "
  265. "usb device %s to bus %s\n",
  266. dev->product_desc, bus->qbus.name);
  267. return -1;
  268. }
  269. dev->attached++;
  270. usb_attach(port);
  271. return 0;
  272. }
  273. int usb_device_detach(USBDevice *dev)
  274. {
  275. USBBus *bus = usb_bus_from_device(dev);
  276. USBPort *port = dev->port;
  277. assert(port != NULL);
  278. assert(dev->attached);
  279. trace_usb_port_detach(bus->busnr, port->path);
  280. usb_detach(port);
  281. dev->attached--;
  282. return 0;
  283. }
  284. int usb_device_delete_addr(int busnr, int addr)
  285. {
  286. USBBus *bus;
  287. USBPort *port;
  288. USBDevice *dev;
  289. bus = usb_bus_find(busnr);
  290. if (!bus)
  291. return -1;
  292. QTAILQ_FOREACH(port, &bus->used, next) {
  293. if (port->dev->addr == addr)
  294. break;
  295. }
  296. if (!port)
  297. return -1;
  298. dev = port->dev;
  299. qdev_free(&dev->qdev);
  300. return 0;
  301. }
  302. static const char *usb_speed(unsigned int speed)
  303. {
  304. static const char *txt[] = {
  305. [ USB_SPEED_LOW ] = "1.5",
  306. [ USB_SPEED_FULL ] = "12",
  307. [ USB_SPEED_HIGH ] = "480",
  308. [ USB_SPEED_SUPER ] = "5000",
  309. };
  310. if (speed >= ARRAY_SIZE(txt))
  311. return "?";
  312. return txt[speed];
  313. }
  314. static void usb_bus_dev_print(Monitor *mon, DeviceState *qdev, int indent)
  315. {
  316. USBDevice *dev = DO_UPCAST(USBDevice, qdev, qdev);
  317. USBBus *bus = usb_bus_from_device(dev);
  318. monitor_printf(mon, "%*saddr %d.%d, port %s, speed %s, name %s%s\n",
  319. indent, "", bus->busnr, dev->addr,
  320. dev->port ? dev->port->path : "-",
  321. usb_speed(dev->speed), dev->product_desc,
  322. dev->attached ? ", attached" : "");
  323. }
  324. static char *usb_get_dev_path(DeviceState *qdev)
  325. {
  326. USBDevice *dev = DO_UPCAST(USBDevice, qdev, qdev);
  327. return g_strdup(dev->port->path);
  328. }
  329. static char *usb_get_fw_dev_path(DeviceState *qdev)
  330. {
  331. USBDevice *dev = DO_UPCAST(USBDevice, qdev, qdev);
  332. char *fw_path, *in;
  333. ssize_t pos = 0, fw_len;
  334. long nr;
  335. fw_len = 32 + strlen(dev->port->path) * 6;
  336. fw_path = g_malloc(fw_len);
  337. in = dev->port->path;
  338. while (fw_len - pos > 0) {
  339. nr = strtol(in, &in, 10);
  340. if (in[0] == '.') {
  341. /* some hub between root port and device */
  342. pos += snprintf(fw_path + pos, fw_len - pos, "hub@%ld/", nr);
  343. in++;
  344. } else {
  345. /* the device itself */
  346. pos += snprintf(fw_path + pos, fw_len - pos, "%s@%ld",
  347. qdev_fw_name(qdev), nr);
  348. break;
  349. }
  350. }
  351. return fw_path;
  352. }
  353. void usb_info(Monitor *mon)
  354. {
  355. USBBus *bus;
  356. USBDevice *dev;
  357. USBPort *port;
  358. if (QTAILQ_EMPTY(&busses)) {
  359. monitor_printf(mon, "USB support not enabled\n");
  360. return;
  361. }
  362. QTAILQ_FOREACH(bus, &busses, next) {
  363. QTAILQ_FOREACH(port, &bus->used, next) {
  364. dev = port->dev;
  365. if (!dev)
  366. continue;
  367. monitor_printf(mon, " Device %d.%d, Port %s, Speed %s Mb/s, Product %s\n",
  368. bus->busnr, dev->addr, port->path, usb_speed(dev->speed),
  369. dev->product_desc);
  370. }
  371. }
  372. }
  373. /* handle legacy -usbdevice cmd line option */
  374. USBDevice *usbdevice_create(const char *cmdline)
  375. {
  376. USBBus *bus = usb_bus_find(-1 /* any */);
  377. DeviceInfo *info;
  378. USBDeviceInfo *usb;
  379. char driver[32];
  380. const char *params;
  381. int len;
  382. params = strchr(cmdline,':');
  383. if (params) {
  384. params++;
  385. len = params - cmdline;
  386. if (len > sizeof(driver))
  387. len = sizeof(driver);
  388. pstrcpy(driver, len, cmdline);
  389. } else {
  390. params = "";
  391. pstrcpy(driver, sizeof(driver), cmdline);
  392. }
  393. for (info = device_info_list; info != NULL; info = info->next) {
  394. if (info->bus_info != &usb_bus_info)
  395. continue;
  396. usb = DO_UPCAST(USBDeviceInfo, qdev, info);
  397. if (usb->usbdevice_name == NULL)
  398. continue;
  399. if (strcmp(usb->usbdevice_name, driver) != 0)
  400. continue;
  401. break;
  402. }
  403. if (info == NULL) {
  404. #if 0
  405. /* no error because some drivers are not converted (yet) */
  406. error_report("usbdevice %s not found", driver);
  407. #endif
  408. return NULL;
  409. }
  410. if (!usb->usbdevice_init) {
  411. if (*params) {
  412. error_report("usbdevice %s accepts no params", driver);
  413. return NULL;
  414. }
  415. return usb_create_simple(bus, usb->qdev.name);
  416. }
  417. return usb->usbdevice_init(params);
  418. }