2
0

core.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821
  1. /*
  2. * QEMU USB emulation
  3. *
  4. * Copyright (c) 2005 Fabrice Bellard
  5. *
  6. * 2008 Generic packet handler rewrite by Max Krasnyansky
  7. *
  8. * Permission is hereby granted, free of charge, to any person obtaining a copy
  9. * of this software and associated documentation files (the "Software"), to deal
  10. * in the Software without restriction, including without limitation the rights
  11. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  12. * copies of the Software, and to permit persons to whom the Software is
  13. * furnished to do so, subject to the following conditions:
  14. *
  15. * The above copyright notice and this permission notice shall be included in
  16. * all copies or substantial portions of the Software.
  17. *
  18. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  19. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  20. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  21. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  22. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  23. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  24. * THE SOFTWARE.
  25. */
  26. #include "qemu/osdep.h"
  27. #include "hw/usb.h"
  28. #include "qemu/iov.h"
  29. #include "trace.h"
  30. void usb_pick_speed(USBPort *port)
  31. {
  32. static const int speeds[] = {
  33. USB_SPEED_SUPER,
  34. USB_SPEED_HIGH,
  35. USB_SPEED_FULL,
  36. USB_SPEED_LOW,
  37. };
  38. USBDevice *udev = port->dev;
  39. int i;
  40. for (i = 0; i < ARRAY_SIZE(speeds); i++) {
  41. if ((udev->speedmask & (1 << speeds[i])) &&
  42. (port->speedmask & (1 << speeds[i]))) {
  43. udev->speed = speeds[i];
  44. return;
  45. }
  46. }
  47. }
  48. void usb_attach(USBPort *port)
  49. {
  50. USBDevice *dev = port->dev;
  51. assert(dev != NULL);
  52. assert(dev->attached);
  53. assert(dev->state == USB_STATE_NOTATTACHED);
  54. usb_pick_speed(port);
  55. port->ops->attach(port);
  56. dev->state = USB_STATE_ATTACHED;
  57. usb_device_handle_attach(dev);
  58. }
  59. void usb_detach(USBPort *port)
  60. {
  61. USBDevice *dev = port->dev;
  62. assert(dev != NULL);
  63. assert(dev->state != USB_STATE_NOTATTACHED);
  64. port->ops->detach(port);
  65. dev->state = USB_STATE_NOTATTACHED;
  66. }
  67. void usb_port_reset(USBPort *port)
  68. {
  69. USBDevice *dev = port->dev;
  70. assert(dev != NULL);
  71. usb_detach(port);
  72. usb_attach(port);
  73. usb_device_reset(dev);
  74. }
  75. void usb_device_reset(USBDevice *dev)
  76. {
  77. if (dev == NULL || !dev->attached) {
  78. return;
  79. }
  80. usb_device_handle_reset(dev);
  81. dev->remote_wakeup = 0;
  82. dev->addr = 0;
  83. dev->state = USB_STATE_DEFAULT;
  84. }
  85. void usb_wakeup(USBEndpoint *ep, unsigned int stream)
  86. {
  87. USBDevice *dev = ep->dev;
  88. USBBus *bus = usb_bus_from_device(dev);
  89. if (!phase_check(PHASE_MACHINE_READY)) {
  90. /*
  91. * This is machine init cold plug. No need to wakeup anyone,
  92. * all devices will be reset anyway. And trying to wakeup can
  93. * cause problems due to hitting uninitialized devices.
  94. */
  95. return;
  96. }
  97. if (dev->remote_wakeup && dev->port && dev->port->ops->wakeup) {
  98. dev->port->ops->wakeup(dev->port);
  99. }
  100. if (bus->ops->wakeup_endpoint) {
  101. bus->ops->wakeup_endpoint(bus, ep, stream);
  102. }
  103. }
  104. /**********************/
  105. /* generic USB device helpers (you are not forced to use them when
  106. writing your USB device driver, but they help handling the
  107. protocol)
  108. */
  109. #define SETUP_STATE_IDLE 0
  110. #define SETUP_STATE_SETUP 1
  111. #define SETUP_STATE_DATA 2
  112. #define SETUP_STATE_ACK 3
  113. #define SETUP_STATE_PARAM 4
  114. static void do_token_setup(USBDevice *s, USBPacket *p)
  115. {
  116. int request, value, index;
  117. unsigned int setup_len;
  118. if (p->iov.size != 8) {
  119. p->status = USB_RET_STALL;
  120. return;
  121. }
  122. usb_packet_copy(p, s->setup_buf, p->iov.size);
  123. s->setup_index = 0;
  124. p->actual_length = 0;
  125. setup_len = (s->setup_buf[7] << 8) | s->setup_buf[6];
  126. if (setup_len > sizeof(s->data_buf)) {
  127. fprintf(stderr,
  128. "usb_generic_handle_packet: ctrl buffer too small (%u > %zu)\n",
  129. setup_len, sizeof(s->data_buf));
  130. p->status = USB_RET_STALL;
  131. return;
  132. }
  133. s->setup_len = setup_len;
  134. request = (s->setup_buf[0] << 8) | s->setup_buf[1];
  135. value = (s->setup_buf[3] << 8) | s->setup_buf[2];
  136. index = (s->setup_buf[5] << 8) | s->setup_buf[4];
  137. if (s->setup_buf[0] & USB_DIR_IN) {
  138. usb_pcap_ctrl(p, true);
  139. usb_device_handle_control(s, p, request, value, index,
  140. s->setup_len, s->data_buf);
  141. if (p->status == USB_RET_ASYNC) {
  142. s->setup_state = SETUP_STATE_SETUP;
  143. }
  144. if (p->status != USB_RET_SUCCESS) {
  145. return;
  146. }
  147. if (p->actual_length < s->setup_len) {
  148. s->setup_len = p->actual_length;
  149. }
  150. s->setup_state = SETUP_STATE_DATA;
  151. } else {
  152. if (s->setup_len == 0)
  153. s->setup_state = SETUP_STATE_ACK;
  154. else
  155. s->setup_state = SETUP_STATE_DATA;
  156. }
  157. p->actual_length = 8;
  158. }
  159. static void do_token_in(USBDevice *s, USBPacket *p)
  160. {
  161. int request, value, index;
  162. assert(p->ep->nr == 0);
  163. request = (s->setup_buf[0] << 8) | s->setup_buf[1];
  164. value = (s->setup_buf[3] << 8) | s->setup_buf[2];
  165. index = (s->setup_buf[5] << 8) | s->setup_buf[4];
  166. switch(s->setup_state) {
  167. case SETUP_STATE_ACK:
  168. if (!(s->setup_buf[0] & USB_DIR_IN)) {
  169. usb_pcap_ctrl(p, true);
  170. usb_device_handle_control(s, p, request, value, index,
  171. s->setup_len, s->data_buf);
  172. if (p->status == USB_RET_ASYNC) {
  173. return;
  174. }
  175. s->setup_state = SETUP_STATE_IDLE;
  176. p->actual_length = 0;
  177. usb_pcap_ctrl(p, false);
  178. }
  179. break;
  180. case SETUP_STATE_DATA:
  181. if (s->setup_buf[0] & USB_DIR_IN) {
  182. int len = s->setup_len - s->setup_index;
  183. if (len > p->iov.size) {
  184. len = p->iov.size;
  185. }
  186. usb_packet_copy(p, s->data_buf + s->setup_index, len);
  187. s->setup_index += len;
  188. if (s->setup_index >= s->setup_len) {
  189. s->setup_state = SETUP_STATE_ACK;
  190. }
  191. return;
  192. }
  193. s->setup_state = SETUP_STATE_IDLE;
  194. p->status = USB_RET_STALL;
  195. usb_pcap_ctrl(p, false);
  196. break;
  197. default:
  198. p->status = USB_RET_STALL;
  199. }
  200. }
  201. static void do_token_out(USBDevice *s, USBPacket *p)
  202. {
  203. assert(p->ep->nr == 0);
  204. switch(s->setup_state) {
  205. case SETUP_STATE_ACK:
  206. if (s->setup_buf[0] & USB_DIR_IN) {
  207. s->setup_state = SETUP_STATE_IDLE;
  208. usb_pcap_ctrl(p, false);
  209. /* transfer OK */
  210. } else {
  211. /* ignore additional output */
  212. }
  213. break;
  214. case SETUP_STATE_DATA:
  215. if (!(s->setup_buf[0] & USB_DIR_IN)) {
  216. int len = s->setup_len - s->setup_index;
  217. if (len > p->iov.size) {
  218. len = p->iov.size;
  219. }
  220. usb_packet_copy(p, s->data_buf + s->setup_index, len);
  221. s->setup_index += len;
  222. if (s->setup_index >= s->setup_len) {
  223. s->setup_state = SETUP_STATE_ACK;
  224. }
  225. return;
  226. }
  227. s->setup_state = SETUP_STATE_IDLE;
  228. p->status = USB_RET_STALL;
  229. usb_pcap_ctrl(p, false);
  230. break;
  231. default:
  232. p->status = USB_RET_STALL;
  233. }
  234. }
  235. static void do_parameter(USBDevice *s, USBPacket *p)
  236. {
  237. int i, request, value, index;
  238. unsigned int setup_len;
  239. for (i = 0; i < 8; i++) {
  240. s->setup_buf[i] = p->parameter >> (i*8);
  241. }
  242. s->setup_state = SETUP_STATE_PARAM;
  243. s->setup_index = 0;
  244. request = (s->setup_buf[0] << 8) | s->setup_buf[1];
  245. value = (s->setup_buf[3] << 8) | s->setup_buf[2];
  246. index = (s->setup_buf[5] << 8) | s->setup_buf[4];
  247. setup_len = (s->setup_buf[7] << 8) | s->setup_buf[6];
  248. if (setup_len > sizeof(s->data_buf)) {
  249. fprintf(stderr,
  250. "usb_generic_handle_packet: ctrl buffer too small (%u > %zu)\n",
  251. setup_len, sizeof(s->data_buf));
  252. p->status = USB_RET_STALL;
  253. return;
  254. }
  255. s->setup_len = setup_len;
  256. if (p->pid == USB_TOKEN_OUT) {
  257. usb_packet_copy(p, s->data_buf, s->setup_len);
  258. }
  259. usb_pcap_ctrl(p, true);
  260. usb_device_handle_control(s, p, request, value, index,
  261. s->setup_len, s->data_buf);
  262. if (p->status == USB_RET_ASYNC) {
  263. return;
  264. }
  265. if (p->actual_length < s->setup_len) {
  266. s->setup_len = p->actual_length;
  267. }
  268. if (p->pid == USB_TOKEN_IN) {
  269. p->actual_length = 0;
  270. usb_packet_copy(p, s->data_buf, s->setup_len);
  271. }
  272. usb_pcap_ctrl(p, false);
  273. }
  274. /* ctrl complete function for devices which use usb_generic_handle_packet and
  275. may return USB_RET_ASYNC from their handle_control callback. Device code
  276. which does this *must* call this function instead of the normal
  277. usb_packet_complete to complete their async control packets. */
  278. void usb_generic_async_ctrl_complete(USBDevice *s, USBPacket *p)
  279. {
  280. if (p->status < 0) {
  281. s->setup_state = SETUP_STATE_IDLE;
  282. usb_pcap_ctrl(p, false);
  283. }
  284. switch (s->setup_state) {
  285. case SETUP_STATE_SETUP:
  286. if (p->actual_length < s->setup_len) {
  287. s->setup_len = p->actual_length;
  288. }
  289. s->setup_state = SETUP_STATE_DATA;
  290. p->actual_length = 8;
  291. break;
  292. case SETUP_STATE_ACK:
  293. s->setup_state = SETUP_STATE_IDLE;
  294. p->actual_length = 0;
  295. usb_pcap_ctrl(p, false);
  296. break;
  297. case SETUP_STATE_PARAM:
  298. if (p->actual_length < s->setup_len) {
  299. s->setup_len = p->actual_length;
  300. }
  301. if (p->pid == USB_TOKEN_IN) {
  302. p->actual_length = 0;
  303. usb_packet_copy(p, s->data_buf, s->setup_len);
  304. }
  305. break;
  306. default:
  307. break;
  308. }
  309. usb_packet_complete(s, p);
  310. }
  311. USBDevice *usb_find_device(USBPort *port, uint8_t addr)
  312. {
  313. USBDevice *dev = port->dev;
  314. if (dev == NULL || !dev->attached || dev->state != USB_STATE_DEFAULT) {
  315. return NULL;
  316. }
  317. if (dev->addr == addr) {
  318. return dev;
  319. }
  320. return usb_device_find_device(dev, addr);
  321. }
  322. static void usb_process_one(USBPacket *p)
  323. {
  324. USBDevice *dev = p->ep->dev;
  325. bool nak;
  326. /*
  327. * Handlers expect status to be initialized to USB_RET_SUCCESS, but it
  328. * can be USB_RET_NAK here from a previous usb_process_one() call,
  329. * or USB_RET_ASYNC from going through usb_queue_one().
  330. */
  331. nak = (p->status == USB_RET_NAK);
  332. p->status = USB_RET_SUCCESS;
  333. if (p->ep->nr == 0) {
  334. /* control pipe */
  335. if (p->parameter) {
  336. do_parameter(dev, p);
  337. return;
  338. }
  339. switch (p->pid) {
  340. case USB_TOKEN_SETUP:
  341. do_token_setup(dev, p);
  342. break;
  343. case USB_TOKEN_IN:
  344. do_token_in(dev, p);
  345. break;
  346. case USB_TOKEN_OUT:
  347. do_token_out(dev, p);
  348. break;
  349. default:
  350. p->status = USB_RET_STALL;
  351. }
  352. } else {
  353. /* data pipe */
  354. if (!nak) {
  355. usb_pcap_data(p, true);
  356. }
  357. usb_device_handle_data(dev, p);
  358. }
  359. }
  360. static void usb_queue_one(USBPacket *p)
  361. {
  362. usb_packet_set_state(p, USB_PACKET_QUEUED);
  363. QTAILQ_INSERT_TAIL(&p->ep->queue, p, queue);
  364. p->status = USB_RET_ASYNC;
  365. }
  366. /* Hand over a packet to a device for processing. p->status ==
  367. USB_RET_ASYNC indicates the processing isn't finished yet, the
  368. driver will call usb_packet_complete() when done processing it. */
  369. void usb_handle_packet(USBDevice *dev, USBPacket *p)
  370. {
  371. if (dev == NULL) {
  372. p->status = USB_RET_NODEV;
  373. return;
  374. }
  375. assert(dev == p->ep->dev);
  376. assert(dev->state == USB_STATE_DEFAULT);
  377. usb_packet_check_state(p, USB_PACKET_SETUP);
  378. assert(p->ep != NULL);
  379. /* Submitting a new packet clears halt */
  380. if (p->ep->halted) {
  381. assert(QTAILQ_EMPTY(&p->ep->queue));
  382. p->ep->halted = false;
  383. }
  384. if (QTAILQ_EMPTY(&p->ep->queue) || p->ep->pipeline || p->stream) {
  385. usb_process_one(p);
  386. if (p->status == USB_RET_ASYNC) {
  387. /* hcd drivers cannot handle async for isoc */
  388. assert(p->ep->type != USB_ENDPOINT_XFER_ISOC);
  389. /* using async for interrupt packets breaks migration */
  390. assert(p->ep->type != USB_ENDPOINT_XFER_INT ||
  391. (dev->flags & (1 << USB_DEV_FLAG_IS_HOST)));
  392. usb_packet_set_state(p, USB_PACKET_ASYNC);
  393. QTAILQ_INSERT_TAIL(&p->ep->queue, p, queue);
  394. } else if (p->status == USB_RET_ADD_TO_QUEUE) {
  395. usb_queue_one(p);
  396. } else {
  397. /*
  398. * When pipelining is enabled usb-devices must always return async,
  399. * otherwise packets can complete out of order!
  400. */
  401. assert(p->stream || !p->ep->pipeline ||
  402. QTAILQ_EMPTY(&p->ep->queue));
  403. if (p->status != USB_RET_NAK) {
  404. usb_pcap_data(p, false);
  405. usb_packet_set_state(p, USB_PACKET_COMPLETE);
  406. }
  407. }
  408. } else {
  409. usb_queue_one(p);
  410. }
  411. }
  412. void usb_packet_complete_one(USBDevice *dev, USBPacket *p)
  413. {
  414. USBEndpoint *ep = p->ep;
  415. assert(p->stream || QTAILQ_FIRST(&ep->queue) == p);
  416. assert(p->status != USB_RET_ASYNC && p->status != USB_RET_NAK);
  417. if (p->status != USB_RET_SUCCESS ||
  418. (p->short_not_ok && (p->actual_length < p->iov.size))) {
  419. ep->halted = true;
  420. }
  421. usb_pcap_data(p, false);
  422. usb_packet_set_state(p, USB_PACKET_COMPLETE);
  423. QTAILQ_REMOVE(&ep->queue, p, queue);
  424. dev->port->ops->complete(dev->port, p);
  425. }
  426. /* Notify the controller that an async packet is complete. This should only
  427. be called for packets previously deferred by returning USB_RET_ASYNC from
  428. handle_packet. */
  429. void usb_packet_complete(USBDevice *dev, USBPacket *p)
  430. {
  431. USBEndpoint *ep = p->ep;
  432. usb_packet_check_state(p, USB_PACKET_ASYNC);
  433. usb_packet_complete_one(dev, p);
  434. while (!QTAILQ_EMPTY(&ep->queue)) {
  435. p = QTAILQ_FIRST(&ep->queue);
  436. if (ep->halted) {
  437. /* Empty the queue on a halt */
  438. p->status = USB_RET_REMOVE_FROM_QUEUE;
  439. dev->port->ops->complete(dev->port, p);
  440. continue;
  441. }
  442. if (p->state == USB_PACKET_ASYNC) {
  443. break;
  444. }
  445. usb_packet_check_state(p, USB_PACKET_QUEUED);
  446. usb_process_one(p);
  447. if (p->status == USB_RET_ASYNC) {
  448. usb_packet_set_state(p, USB_PACKET_ASYNC);
  449. break;
  450. }
  451. usb_packet_complete_one(ep->dev, p);
  452. }
  453. }
  454. /* Cancel an active packet. The packed must have been deferred by
  455. returning USB_RET_ASYNC from handle_packet, and not yet
  456. completed. */
  457. void usb_cancel_packet(USBPacket * p)
  458. {
  459. bool callback = (p->state == USB_PACKET_ASYNC);
  460. assert(usb_packet_is_inflight(p));
  461. usb_packet_set_state(p, USB_PACKET_CANCELED);
  462. QTAILQ_REMOVE(&p->ep->queue, p, queue);
  463. if (callback) {
  464. usb_device_cancel_packet(p->ep->dev, p);
  465. }
  466. }
  467. void usb_packet_init(USBPacket *p)
  468. {
  469. qemu_iovec_init(&p->iov, 1);
  470. }
  471. static const char *usb_packet_state_name(USBPacketState state)
  472. {
  473. static const char *name[] = {
  474. [USB_PACKET_UNDEFINED] = "undef",
  475. [USB_PACKET_SETUP] = "setup",
  476. [USB_PACKET_QUEUED] = "queued",
  477. [USB_PACKET_ASYNC] = "async",
  478. [USB_PACKET_COMPLETE] = "complete",
  479. [USB_PACKET_CANCELED] = "canceled",
  480. };
  481. if (state < ARRAY_SIZE(name)) {
  482. return name[state];
  483. }
  484. return "INVALID";
  485. }
  486. void usb_packet_check_state(USBPacket *p, USBPacketState expected)
  487. {
  488. USBDevice *dev;
  489. USBBus *bus;
  490. if (p->state == expected) {
  491. return;
  492. }
  493. dev = p->ep->dev;
  494. bus = usb_bus_from_device(dev);
  495. trace_usb_packet_state_fault(bus->busnr, dev->port->path, p->ep->nr, p,
  496. usb_packet_state_name(p->state),
  497. usb_packet_state_name(expected));
  498. assert(!"usb packet state check failed");
  499. }
  500. void usb_packet_set_state(USBPacket *p, USBPacketState state)
  501. {
  502. if (p->ep) {
  503. USBDevice *dev = p->ep->dev;
  504. USBBus *bus = usb_bus_from_device(dev);
  505. trace_usb_packet_state_change(bus->busnr, dev->port->path, p->ep->nr, p,
  506. usb_packet_state_name(p->state),
  507. usb_packet_state_name(state));
  508. } else {
  509. trace_usb_packet_state_change(-1, "", -1, p,
  510. usb_packet_state_name(p->state),
  511. usb_packet_state_name(state));
  512. }
  513. p->state = state;
  514. }
  515. void usb_packet_setup(USBPacket *p, int pid,
  516. USBEndpoint *ep, unsigned int stream,
  517. uint64_t id, bool short_not_ok, bool int_req)
  518. {
  519. assert(!usb_packet_is_inflight(p));
  520. assert(p->iov.iov != NULL);
  521. p->id = id;
  522. p->pid = pid;
  523. p->ep = ep;
  524. p->stream = stream;
  525. p->status = USB_RET_SUCCESS;
  526. p->actual_length = 0;
  527. p->parameter = 0;
  528. p->short_not_ok = short_not_ok;
  529. p->int_req = int_req;
  530. p->combined = NULL;
  531. qemu_iovec_reset(&p->iov);
  532. usb_packet_set_state(p, USB_PACKET_SETUP);
  533. }
  534. void usb_packet_addbuf(USBPacket *p, void *ptr, size_t len)
  535. {
  536. qemu_iovec_add(&p->iov, ptr, len);
  537. }
  538. void usb_packet_copy(USBPacket *p, void *ptr, size_t bytes)
  539. {
  540. QEMUIOVector *iov = p->combined ? &p->combined->iov : &p->iov;
  541. assert(p->actual_length >= 0);
  542. assert(p->actual_length + bytes <= iov->size);
  543. switch (p->pid) {
  544. case USB_TOKEN_SETUP:
  545. case USB_TOKEN_OUT:
  546. iov_to_buf(iov->iov, iov->niov, p->actual_length, ptr, bytes);
  547. break;
  548. case USB_TOKEN_IN:
  549. iov_from_buf(iov->iov, iov->niov, p->actual_length, ptr, bytes);
  550. break;
  551. default:
  552. fprintf(stderr, "%s: invalid pid: %x\n", __func__, p->pid);
  553. abort();
  554. }
  555. p->actual_length += bytes;
  556. }
  557. void usb_packet_skip(USBPacket *p, size_t bytes)
  558. {
  559. QEMUIOVector *iov = p->combined ? &p->combined->iov : &p->iov;
  560. assert(p->actual_length >= 0);
  561. assert(p->actual_length + bytes <= iov->size);
  562. if (p->pid == USB_TOKEN_IN) {
  563. iov_memset(iov->iov, iov->niov, p->actual_length, 0, bytes);
  564. }
  565. p->actual_length += bytes;
  566. }
  567. size_t usb_packet_size(USBPacket *p)
  568. {
  569. return p->combined ? p->combined->iov.size : p->iov.size;
  570. }
  571. void usb_packet_cleanup(USBPacket *p)
  572. {
  573. assert(!usb_packet_is_inflight(p));
  574. qemu_iovec_destroy(&p->iov);
  575. }
  576. void usb_ep_reset(USBDevice *dev)
  577. {
  578. int ep;
  579. dev->ep_ctl.nr = 0;
  580. dev->ep_ctl.type = USB_ENDPOINT_XFER_CONTROL;
  581. dev->ep_ctl.ifnum = 0;
  582. dev->ep_ctl.max_packet_size = 64;
  583. dev->ep_ctl.max_streams = 0;
  584. dev->ep_ctl.dev = dev;
  585. dev->ep_ctl.pipeline = false;
  586. for (ep = 0; ep < USB_MAX_ENDPOINTS; ep++) {
  587. dev->ep_in[ep].nr = ep + 1;
  588. dev->ep_out[ep].nr = ep + 1;
  589. dev->ep_in[ep].pid = USB_TOKEN_IN;
  590. dev->ep_out[ep].pid = USB_TOKEN_OUT;
  591. dev->ep_in[ep].type = USB_ENDPOINT_XFER_INVALID;
  592. dev->ep_out[ep].type = USB_ENDPOINT_XFER_INVALID;
  593. dev->ep_in[ep].ifnum = USB_INTERFACE_INVALID;
  594. dev->ep_out[ep].ifnum = USB_INTERFACE_INVALID;
  595. dev->ep_in[ep].max_packet_size = 0;
  596. dev->ep_out[ep].max_packet_size = 0;
  597. dev->ep_in[ep].max_streams = 0;
  598. dev->ep_out[ep].max_streams = 0;
  599. dev->ep_in[ep].dev = dev;
  600. dev->ep_out[ep].dev = dev;
  601. dev->ep_in[ep].pipeline = false;
  602. dev->ep_out[ep].pipeline = false;
  603. }
  604. }
  605. void usb_ep_init(USBDevice *dev)
  606. {
  607. int ep;
  608. usb_ep_reset(dev);
  609. QTAILQ_INIT(&dev->ep_ctl.queue);
  610. for (ep = 0; ep < USB_MAX_ENDPOINTS; ep++) {
  611. QTAILQ_INIT(&dev->ep_in[ep].queue);
  612. QTAILQ_INIT(&dev->ep_out[ep].queue);
  613. }
  614. }
  615. void usb_ep_dump(USBDevice *dev)
  616. {
  617. static const char *tname[] = {
  618. [USB_ENDPOINT_XFER_CONTROL] = "control",
  619. [USB_ENDPOINT_XFER_ISOC] = "isoc",
  620. [USB_ENDPOINT_XFER_BULK] = "bulk",
  621. [USB_ENDPOINT_XFER_INT] = "int",
  622. };
  623. int ifnum, ep, first;
  624. fprintf(stderr, "Device \"%s\", config %d\n",
  625. dev->product_desc, dev->configuration);
  626. for (ifnum = 0; ifnum < 16; ifnum++) {
  627. first = 1;
  628. for (ep = 0; ep < USB_MAX_ENDPOINTS; ep++) {
  629. if (dev->ep_in[ep].type != USB_ENDPOINT_XFER_INVALID &&
  630. dev->ep_in[ep].ifnum == ifnum) {
  631. if (first) {
  632. first = 0;
  633. fprintf(stderr, " Interface %d, alternative %d\n",
  634. ifnum, dev->altsetting[ifnum]);
  635. }
  636. fprintf(stderr, " Endpoint %d, IN, %s, %d max\n", ep,
  637. tname[dev->ep_in[ep].type],
  638. dev->ep_in[ep].max_packet_size);
  639. }
  640. if (dev->ep_out[ep].type != USB_ENDPOINT_XFER_INVALID &&
  641. dev->ep_out[ep].ifnum == ifnum) {
  642. if (first) {
  643. first = 0;
  644. fprintf(stderr, " Interface %d, alternative %d\n",
  645. ifnum, dev->altsetting[ifnum]);
  646. }
  647. fprintf(stderr, " Endpoint %d, OUT, %s, %d max\n", ep,
  648. tname[dev->ep_out[ep].type],
  649. dev->ep_out[ep].max_packet_size);
  650. }
  651. }
  652. }
  653. fprintf(stderr, "--\n");
  654. }
  655. struct USBEndpoint *usb_ep_get(USBDevice *dev, int pid, int ep)
  656. {
  657. struct USBEndpoint *eps;
  658. assert(dev != NULL);
  659. if (ep == 0) {
  660. return &dev->ep_ctl;
  661. }
  662. assert(pid == USB_TOKEN_IN || pid == USB_TOKEN_OUT);
  663. assert(ep > 0 && ep <= USB_MAX_ENDPOINTS);
  664. eps = (pid == USB_TOKEN_IN) ? dev->ep_in : dev->ep_out;
  665. return eps + ep - 1;
  666. }
  667. uint8_t usb_ep_get_type(USBDevice *dev, int pid, int ep)
  668. {
  669. struct USBEndpoint *uep = usb_ep_get(dev, pid, ep);
  670. return uep->type;
  671. }
  672. void usb_ep_set_type(USBDevice *dev, int pid, int ep, uint8_t type)
  673. {
  674. struct USBEndpoint *uep = usb_ep_get(dev, pid, ep);
  675. uep->type = type;
  676. }
  677. void usb_ep_set_ifnum(USBDevice *dev, int pid, int ep, uint8_t ifnum)
  678. {
  679. struct USBEndpoint *uep = usb_ep_get(dev, pid, ep);
  680. uep->ifnum = ifnum;
  681. }
  682. void usb_ep_set_max_packet_size(USBDevice *dev, int pid, int ep,
  683. uint16_t raw)
  684. {
  685. struct USBEndpoint *uep = usb_ep_get(dev, pid, ep);
  686. int size, microframes;
  687. size = raw & 0x7ff;
  688. switch ((raw >> 11) & 3) {
  689. case 1:
  690. microframes = 2;
  691. break;
  692. case 2:
  693. microframes = 3;
  694. break;
  695. default:
  696. microframes = 1;
  697. break;
  698. }
  699. uep->max_packet_size = size * microframes;
  700. }
  701. void usb_ep_set_max_streams(USBDevice *dev, int pid, int ep, uint8_t raw)
  702. {
  703. struct USBEndpoint *uep = usb_ep_get(dev, pid, ep);
  704. int MaxStreams;
  705. MaxStreams = raw & 0x1f;
  706. if (MaxStreams) {
  707. uep->max_streams = 1 << MaxStreams;
  708. } else {
  709. uep->max_streams = 0;
  710. }
  711. }
  712. void usb_ep_set_halted(USBDevice *dev, int pid, int ep, bool halted)
  713. {
  714. struct USBEndpoint *uep = usb_ep_get(dev, pid, ep);
  715. uep->halted = halted;
  716. }
  717. USBPacket *usb_ep_find_packet_by_id(USBDevice *dev, int pid, int ep,
  718. uint64_t id)
  719. {
  720. struct USBEndpoint *uep = usb_ep_get(dev, pid, ep);
  721. USBPacket *p;
  722. QTAILQ_FOREACH(p, &uep->queue, queue) {
  723. if (p->id == id) {
  724. return p;
  725. }
  726. }
  727. return NULL;
  728. }