usb-bus.c 12 KB

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