2
0

dev-uas.c 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971
  1. /*
  2. * UAS (USB Attached SCSI) emulation
  3. *
  4. * Copyright Red Hat, Inc. 2012
  5. *
  6. * Author: Gerd Hoffmann <kraxel@redhat.com>
  7. *
  8. * This work is licensed under the terms of the GNU GPL, version 2 or later.
  9. * See the COPYING file in the top-level directory.
  10. */
  11. #include "qemu/osdep.h"
  12. #include "qemu/option.h"
  13. #include "qemu/config-file.h"
  14. #include "trace.h"
  15. #include "qemu/error-report.h"
  16. #include "qemu/main-loop.h"
  17. #include "qemu/module.h"
  18. #include "hw/usb.h"
  19. #include "migration/vmstate.h"
  20. #include "desc.h"
  21. #include "hw/qdev-properties.h"
  22. #include "hw/scsi/scsi.h"
  23. #include "scsi/constants.h"
  24. #include "qom/object.h"
  25. /* --------------------------------------------------------------------- */
  26. #define UAS_UI_COMMAND 0x01
  27. #define UAS_UI_SENSE 0x03
  28. #define UAS_UI_RESPONSE 0x04
  29. #define UAS_UI_TASK_MGMT 0x05
  30. #define UAS_UI_READ_READY 0x06
  31. #define UAS_UI_WRITE_READY 0x07
  32. #define UAS_RC_TMF_COMPLETE 0x00
  33. #define UAS_RC_INVALID_INFO_UNIT 0x02
  34. #define UAS_RC_TMF_NOT_SUPPORTED 0x04
  35. #define UAS_RC_TMF_FAILED 0x05
  36. #define UAS_RC_TMF_SUCCEEDED 0x08
  37. #define UAS_RC_INCORRECT_LUN 0x09
  38. #define UAS_RC_OVERLAPPED_TAG 0x0a
  39. #define UAS_TMF_ABORT_TASK 0x01
  40. #define UAS_TMF_ABORT_TASK_SET 0x02
  41. #define UAS_TMF_CLEAR_TASK_SET 0x04
  42. #define UAS_TMF_LOGICAL_UNIT_RESET 0x08
  43. #define UAS_TMF_I_T_NEXUS_RESET 0x10
  44. #define UAS_TMF_CLEAR_ACA 0x40
  45. #define UAS_TMF_QUERY_TASK 0x80
  46. #define UAS_TMF_QUERY_TASK_SET 0x81
  47. #define UAS_TMF_QUERY_ASYNC_EVENT 0x82
  48. #define UAS_PIPE_ID_COMMAND 0x01
  49. #define UAS_PIPE_ID_STATUS 0x02
  50. #define UAS_PIPE_ID_DATA_IN 0x03
  51. #define UAS_PIPE_ID_DATA_OUT 0x04
  52. typedef struct {
  53. uint8_t id;
  54. uint8_t reserved;
  55. uint16_t tag;
  56. } QEMU_PACKED uas_iu_header;
  57. typedef struct {
  58. uint8_t prio_taskattr; /* 6:3 priority, 2:0 task attribute */
  59. uint8_t reserved_1;
  60. uint8_t add_cdb_length; /* 7:2 additional adb length (dwords) */
  61. uint8_t reserved_2;
  62. uint64_t lun;
  63. uint8_t cdb[16];
  64. uint8_t add_cdb[];
  65. } QEMU_PACKED uas_iu_command;
  66. typedef struct {
  67. uint16_t status_qualifier;
  68. uint8_t status;
  69. uint8_t reserved[7];
  70. uint16_t sense_length;
  71. uint8_t sense_data[18];
  72. } QEMU_PACKED uas_iu_sense;
  73. typedef struct {
  74. uint8_t add_response_info[3];
  75. uint8_t response_code;
  76. } QEMU_PACKED uas_iu_response;
  77. typedef struct {
  78. uint8_t function;
  79. uint8_t reserved;
  80. uint16_t task_tag;
  81. uint64_t lun;
  82. } QEMU_PACKED uas_iu_task_mgmt;
  83. typedef struct {
  84. uas_iu_header hdr;
  85. union {
  86. uas_iu_command command;
  87. uas_iu_sense sense;
  88. uas_iu_task_mgmt task;
  89. uas_iu_response response;
  90. };
  91. } QEMU_PACKED uas_iu;
  92. /* --------------------------------------------------------------------- */
  93. #define UAS_STREAM_BM_ATTR 4
  94. #define UAS_MAX_STREAMS (1 << UAS_STREAM_BM_ATTR)
  95. typedef struct UASDevice UASDevice;
  96. typedef struct UASRequest UASRequest;
  97. typedef struct UASStatus UASStatus;
  98. struct UASDevice {
  99. USBDevice dev;
  100. SCSIBus bus;
  101. QEMUBH *status_bh;
  102. QTAILQ_HEAD(, UASStatus) results;
  103. QTAILQ_HEAD(, UASRequest) requests;
  104. /* properties */
  105. uint32_t requestlog;
  106. /* usb 2.0 only */
  107. USBPacket *status2;
  108. UASRequest *datain2;
  109. UASRequest *dataout2;
  110. /* usb 3.0 only */
  111. USBPacket *data3[UAS_MAX_STREAMS + 1];
  112. USBPacket *status3[UAS_MAX_STREAMS + 1];
  113. };
  114. #define TYPE_USB_UAS "usb-uas"
  115. OBJECT_DECLARE_SIMPLE_TYPE(UASDevice, USB_UAS)
  116. struct UASRequest {
  117. uint16_t tag;
  118. uint64_t lun;
  119. UASDevice *uas;
  120. SCSIDevice *dev;
  121. SCSIRequest *req;
  122. USBPacket *data;
  123. bool data_async;
  124. bool active;
  125. bool complete;
  126. uint32_t buf_off;
  127. uint32_t buf_size;
  128. uint32_t data_off;
  129. uint32_t data_size;
  130. QTAILQ_ENTRY(UASRequest) next;
  131. };
  132. struct UASStatus {
  133. uint32_t stream;
  134. uas_iu status;
  135. uint32_t length;
  136. QTAILQ_ENTRY(UASStatus) next;
  137. };
  138. /* --------------------------------------------------------------------- */
  139. enum {
  140. STR_MANUFACTURER = 1,
  141. STR_PRODUCT,
  142. STR_SERIALNUMBER,
  143. STR_CONFIG_HIGH,
  144. STR_CONFIG_SUPER,
  145. };
  146. static const USBDescStrings desc_strings = {
  147. [STR_MANUFACTURER] = "QEMU",
  148. [STR_PRODUCT] = "USB Attached SCSI HBA",
  149. [STR_SERIALNUMBER] = "27842",
  150. [STR_CONFIG_HIGH] = "High speed config (usb 2.0)",
  151. [STR_CONFIG_SUPER] = "Super speed config (usb 3.0)",
  152. };
  153. static const USBDescIface desc_iface_high = {
  154. .bInterfaceNumber = 0,
  155. .bNumEndpoints = 4,
  156. .bInterfaceClass = USB_CLASS_MASS_STORAGE,
  157. .bInterfaceSubClass = 0x06, /* SCSI */
  158. .bInterfaceProtocol = 0x62, /* UAS */
  159. .eps = (USBDescEndpoint[]) {
  160. {
  161. .bEndpointAddress = USB_DIR_OUT | UAS_PIPE_ID_COMMAND,
  162. .bmAttributes = USB_ENDPOINT_XFER_BULK,
  163. .wMaxPacketSize = 512,
  164. .extra = (uint8_t[]) {
  165. 0x04, /* u8 bLength */
  166. 0x24, /* u8 bDescriptorType */
  167. UAS_PIPE_ID_COMMAND,
  168. 0x00, /* u8 bReserved */
  169. },
  170. },{
  171. .bEndpointAddress = USB_DIR_IN | UAS_PIPE_ID_STATUS,
  172. .bmAttributes = USB_ENDPOINT_XFER_BULK,
  173. .wMaxPacketSize = 512,
  174. .extra = (uint8_t[]) {
  175. 0x04, /* u8 bLength */
  176. 0x24, /* u8 bDescriptorType */
  177. UAS_PIPE_ID_STATUS,
  178. 0x00, /* u8 bReserved */
  179. },
  180. },{
  181. .bEndpointAddress = USB_DIR_IN | UAS_PIPE_ID_DATA_IN,
  182. .bmAttributes = USB_ENDPOINT_XFER_BULK,
  183. .wMaxPacketSize = 512,
  184. .extra = (uint8_t[]) {
  185. 0x04, /* u8 bLength */
  186. 0x24, /* u8 bDescriptorType */
  187. UAS_PIPE_ID_DATA_IN,
  188. 0x00, /* u8 bReserved */
  189. },
  190. },{
  191. .bEndpointAddress = USB_DIR_OUT | UAS_PIPE_ID_DATA_OUT,
  192. .bmAttributes = USB_ENDPOINT_XFER_BULK,
  193. .wMaxPacketSize = 512,
  194. .extra = (uint8_t[]) {
  195. 0x04, /* u8 bLength */
  196. 0x24, /* u8 bDescriptorType */
  197. UAS_PIPE_ID_DATA_OUT,
  198. 0x00, /* u8 bReserved */
  199. },
  200. },
  201. }
  202. };
  203. static const USBDescIface desc_iface_super = {
  204. .bInterfaceNumber = 0,
  205. .bNumEndpoints = 4,
  206. .bInterfaceClass = USB_CLASS_MASS_STORAGE,
  207. .bInterfaceSubClass = 0x06, /* SCSI */
  208. .bInterfaceProtocol = 0x62, /* UAS */
  209. .eps = (USBDescEndpoint[]) {
  210. {
  211. .bEndpointAddress = USB_DIR_OUT | UAS_PIPE_ID_COMMAND,
  212. .bmAttributes = USB_ENDPOINT_XFER_BULK,
  213. .wMaxPacketSize = 1024,
  214. .bMaxBurst = 15,
  215. .extra = (uint8_t[]) {
  216. 0x04, /* u8 bLength */
  217. 0x24, /* u8 bDescriptorType */
  218. UAS_PIPE_ID_COMMAND,
  219. 0x00, /* u8 bReserved */
  220. },
  221. },{
  222. .bEndpointAddress = USB_DIR_IN | UAS_PIPE_ID_STATUS,
  223. .bmAttributes = USB_ENDPOINT_XFER_BULK,
  224. .wMaxPacketSize = 1024,
  225. .bMaxBurst = 15,
  226. .bmAttributes_super = UAS_STREAM_BM_ATTR,
  227. .extra = (uint8_t[]) {
  228. 0x04, /* u8 bLength */
  229. 0x24, /* u8 bDescriptorType */
  230. UAS_PIPE_ID_STATUS,
  231. 0x00, /* u8 bReserved */
  232. },
  233. },{
  234. .bEndpointAddress = USB_DIR_IN | UAS_PIPE_ID_DATA_IN,
  235. .bmAttributes = USB_ENDPOINT_XFER_BULK,
  236. .wMaxPacketSize = 1024,
  237. .bMaxBurst = 15,
  238. .bmAttributes_super = UAS_STREAM_BM_ATTR,
  239. .extra = (uint8_t[]) {
  240. 0x04, /* u8 bLength */
  241. 0x24, /* u8 bDescriptorType */
  242. UAS_PIPE_ID_DATA_IN,
  243. 0x00, /* u8 bReserved */
  244. },
  245. },{
  246. .bEndpointAddress = USB_DIR_OUT | UAS_PIPE_ID_DATA_OUT,
  247. .bmAttributes = USB_ENDPOINT_XFER_BULK,
  248. .wMaxPacketSize = 1024,
  249. .bMaxBurst = 15,
  250. .bmAttributes_super = UAS_STREAM_BM_ATTR,
  251. .extra = (uint8_t[]) {
  252. 0x04, /* u8 bLength */
  253. 0x24, /* u8 bDescriptorType */
  254. UAS_PIPE_ID_DATA_OUT,
  255. 0x00, /* u8 bReserved */
  256. },
  257. },
  258. }
  259. };
  260. static const USBDescDevice desc_device_high = {
  261. .bcdUSB = 0x0200,
  262. .bMaxPacketSize0 = 64,
  263. .bNumConfigurations = 1,
  264. .confs = (USBDescConfig[]) {
  265. {
  266. .bNumInterfaces = 1,
  267. .bConfigurationValue = 1,
  268. .iConfiguration = STR_CONFIG_HIGH,
  269. .bmAttributes = USB_CFG_ATT_ONE | USB_CFG_ATT_SELFPOWER,
  270. .nif = 1,
  271. .ifs = &desc_iface_high,
  272. },
  273. },
  274. };
  275. static const USBDescDevice desc_device_super = {
  276. .bcdUSB = 0x0300,
  277. .bMaxPacketSize0 = 9,
  278. .bNumConfigurations = 1,
  279. .confs = (USBDescConfig[]) {
  280. {
  281. .bNumInterfaces = 1,
  282. .bConfigurationValue = 1,
  283. .iConfiguration = STR_CONFIG_SUPER,
  284. .bmAttributes = USB_CFG_ATT_ONE | USB_CFG_ATT_SELFPOWER,
  285. .nif = 1,
  286. .ifs = &desc_iface_super,
  287. },
  288. },
  289. };
  290. static const USBDesc desc = {
  291. .id = {
  292. .idVendor = 0x46f4, /* CRC16() of "QEMU" */
  293. .idProduct = 0x0003,
  294. .bcdDevice = 0,
  295. .iManufacturer = STR_MANUFACTURER,
  296. .iProduct = STR_PRODUCT,
  297. .iSerialNumber = STR_SERIALNUMBER,
  298. },
  299. .high = &desc_device_high,
  300. .super = &desc_device_super,
  301. .str = desc_strings,
  302. };
  303. /* --------------------------------------------------------------------- */
  304. static bool uas_using_streams(UASDevice *uas)
  305. {
  306. return uas->dev.speed == USB_SPEED_SUPER;
  307. }
  308. /* --------------------------------------------------------------------- */
  309. static UASStatus *usb_uas_alloc_status(UASDevice *uas, uint8_t id, uint16_t tag)
  310. {
  311. UASStatus *st = g_new0(UASStatus, 1);
  312. st->status.hdr.id = id;
  313. st->status.hdr.tag = cpu_to_be16(tag);
  314. st->length = sizeof(uas_iu_header);
  315. if (uas_using_streams(uas)) {
  316. st->stream = tag;
  317. }
  318. return st;
  319. }
  320. static void usb_uas_send_status_bh(void *opaque)
  321. {
  322. UASDevice *uas = opaque;
  323. UASStatus *st;
  324. USBPacket *p;
  325. while ((st = QTAILQ_FIRST(&uas->results)) != NULL) {
  326. if (uas_using_streams(uas)) {
  327. p = uas->status3[st->stream];
  328. uas->status3[st->stream] = NULL;
  329. } else {
  330. p = uas->status2;
  331. uas->status2 = NULL;
  332. }
  333. if (p == NULL) {
  334. break;
  335. }
  336. usb_packet_copy(p, &st->status, st->length);
  337. QTAILQ_REMOVE(&uas->results, st, next);
  338. g_free(st);
  339. p->status = USB_RET_SUCCESS; /* Clear previous ASYNC status */
  340. usb_packet_complete(&uas->dev, p);
  341. }
  342. }
  343. static void usb_uas_queue_status(UASDevice *uas, UASStatus *st, int length)
  344. {
  345. USBPacket *p = uas_using_streams(uas) ?
  346. uas->status3[st->stream] : uas->status2;
  347. st->length += length;
  348. QTAILQ_INSERT_TAIL(&uas->results, st, next);
  349. if (p) {
  350. /*
  351. * Just schedule bh make sure any in-flight data transaction
  352. * is finished before completing (sending) the status packet.
  353. */
  354. qemu_bh_schedule(uas->status_bh);
  355. } else {
  356. USBEndpoint *ep = usb_ep_get(&uas->dev, USB_TOKEN_IN,
  357. UAS_PIPE_ID_STATUS);
  358. usb_wakeup(ep, st->stream);
  359. }
  360. }
  361. static void usb_uas_queue_response(UASDevice *uas, uint16_t tag, uint8_t code)
  362. {
  363. UASStatus *st = usb_uas_alloc_status(uas, UAS_UI_RESPONSE, tag);
  364. trace_usb_uas_response(uas->dev.addr, tag, code);
  365. st->status.response.response_code = code;
  366. usb_uas_queue_status(uas, st, sizeof(uas_iu_response));
  367. }
  368. static void usb_uas_queue_sense(UASRequest *req, uint8_t status)
  369. {
  370. UASStatus *st = usb_uas_alloc_status(req->uas, UAS_UI_SENSE, req->tag);
  371. int len, slen = 0;
  372. trace_usb_uas_sense(req->uas->dev.addr, req->tag, status);
  373. st->status.sense.status = status;
  374. st->status.sense.status_qualifier = cpu_to_be16(0);
  375. if (status != GOOD) {
  376. slen = scsi_req_get_sense(req->req, st->status.sense.sense_data,
  377. sizeof(st->status.sense.sense_data));
  378. st->status.sense.sense_length = cpu_to_be16(slen);
  379. }
  380. len = sizeof(uas_iu_sense) - sizeof(st->status.sense.sense_data) + slen;
  381. usb_uas_queue_status(req->uas, st, len);
  382. }
  383. static void usb_uas_queue_fake_sense(UASDevice *uas, uint16_t tag,
  384. struct SCSISense sense)
  385. {
  386. UASStatus *st = usb_uas_alloc_status(uas, UAS_UI_SENSE, tag);
  387. int len, slen = 0;
  388. st->status.sense.status = CHECK_CONDITION;
  389. st->status.sense.status_qualifier = cpu_to_be16(0);
  390. st->status.sense.sense_data[0] = 0x70;
  391. st->status.sense.sense_data[2] = sense.key;
  392. st->status.sense.sense_data[7] = 10;
  393. st->status.sense.sense_data[12] = sense.asc;
  394. st->status.sense.sense_data[13] = sense.ascq;
  395. slen = 18;
  396. len = sizeof(uas_iu_sense) - sizeof(st->status.sense.sense_data) + slen;
  397. usb_uas_queue_status(uas, st, len);
  398. }
  399. static void usb_uas_queue_read_ready(UASRequest *req)
  400. {
  401. UASStatus *st = usb_uas_alloc_status(req->uas, UAS_UI_READ_READY,
  402. req->tag);
  403. trace_usb_uas_read_ready(req->uas->dev.addr, req->tag);
  404. usb_uas_queue_status(req->uas, st, 0);
  405. }
  406. static void usb_uas_queue_write_ready(UASRequest *req)
  407. {
  408. UASStatus *st = usb_uas_alloc_status(req->uas, UAS_UI_WRITE_READY,
  409. req->tag);
  410. trace_usb_uas_write_ready(req->uas->dev.addr, req->tag);
  411. usb_uas_queue_status(req->uas, st, 0);
  412. }
  413. /* --------------------------------------------------------------------- */
  414. static int usb_uas_get_lun(uint64_t lun64)
  415. {
  416. return (lun64 >> 48) & 0xff;
  417. }
  418. static SCSIDevice *usb_uas_get_dev(UASDevice *uas, uint64_t lun64)
  419. {
  420. if ((lun64 >> 56) != 0x00) {
  421. return NULL;
  422. }
  423. return scsi_device_find(&uas->bus, 0, 0, usb_uas_get_lun(lun64));
  424. }
  425. static void usb_uas_complete_data_packet(UASRequest *req)
  426. {
  427. USBPacket *p;
  428. if (!req->data_async) {
  429. return;
  430. }
  431. p = req->data;
  432. req->data = NULL;
  433. req->data_async = false;
  434. p->status = USB_RET_SUCCESS; /* Clear previous ASYNC status */
  435. usb_packet_complete(&req->uas->dev, p);
  436. }
  437. static void usb_uas_copy_data(UASRequest *req)
  438. {
  439. uint32_t length;
  440. length = MIN(req->buf_size - req->buf_off,
  441. req->data->iov.size - req->data->actual_length);
  442. trace_usb_uas_xfer_data(req->uas->dev.addr, req->tag, length,
  443. req->data->actual_length, req->data->iov.size,
  444. req->buf_off, req->buf_size);
  445. usb_packet_copy(req->data, scsi_req_get_buf(req->req) + req->buf_off,
  446. length);
  447. req->buf_off += length;
  448. req->data_off += length;
  449. if (req->data->actual_length == req->data->iov.size) {
  450. usb_uas_complete_data_packet(req);
  451. }
  452. if (req->buf_size && req->buf_off == req->buf_size) {
  453. req->buf_off = 0;
  454. req->buf_size = 0;
  455. scsi_req_continue(req->req);
  456. }
  457. }
  458. static void usb_uas_start_next_transfer(UASDevice *uas)
  459. {
  460. UASRequest *req;
  461. if (uas_using_streams(uas)) {
  462. return;
  463. }
  464. QTAILQ_FOREACH(req, &uas->requests, next) {
  465. if (req->active || req->complete) {
  466. continue;
  467. }
  468. if (req->req->cmd.mode == SCSI_XFER_FROM_DEV && uas->datain2 == NULL) {
  469. uas->datain2 = req;
  470. usb_uas_queue_read_ready(req);
  471. req->active = true;
  472. return;
  473. }
  474. if (req->req->cmd.mode == SCSI_XFER_TO_DEV && uas->dataout2 == NULL) {
  475. uas->dataout2 = req;
  476. usb_uas_queue_write_ready(req);
  477. req->active = true;
  478. return;
  479. }
  480. }
  481. }
  482. static UASRequest *usb_uas_alloc_request(UASDevice *uas, uas_iu *iu)
  483. {
  484. UASRequest *req;
  485. req = g_new0(UASRequest, 1);
  486. req->uas = uas;
  487. req->tag = be16_to_cpu(iu->hdr.tag);
  488. req->lun = be64_to_cpu(iu->command.lun);
  489. req->dev = usb_uas_get_dev(req->uas, req->lun);
  490. return req;
  491. }
  492. static void usb_uas_scsi_free_request(SCSIBus *bus, void *priv)
  493. {
  494. UASRequest *req = priv;
  495. UASDevice *uas = req->uas;
  496. if (req == uas->datain2) {
  497. uas->datain2 = NULL;
  498. }
  499. if (req == uas->dataout2) {
  500. uas->dataout2 = NULL;
  501. }
  502. QTAILQ_REMOVE(&uas->requests, req, next);
  503. g_free(req);
  504. usb_uas_start_next_transfer(uas);
  505. }
  506. static UASRequest *usb_uas_find_request(UASDevice *uas, uint16_t tag)
  507. {
  508. UASRequest *req;
  509. QTAILQ_FOREACH(req, &uas->requests, next) {
  510. if (req->tag == tag) {
  511. return req;
  512. }
  513. }
  514. return NULL;
  515. }
  516. static void usb_uas_scsi_transfer_data(SCSIRequest *r, uint32_t len)
  517. {
  518. UASRequest *req = r->hba_private;
  519. trace_usb_uas_scsi_data(req->uas->dev.addr, req->tag, len);
  520. req->buf_off = 0;
  521. req->buf_size = len;
  522. if (req->data) {
  523. usb_uas_copy_data(req);
  524. } else {
  525. usb_uas_start_next_transfer(req->uas);
  526. }
  527. }
  528. static void usb_uas_scsi_command_complete(SCSIRequest *r,
  529. uint32_t status, size_t resid)
  530. {
  531. UASRequest *req = r->hba_private;
  532. trace_usb_uas_scsi_complete(req->uas->dev.addr, req->tag, status, resid);
  533. req->complete = true;
  534. if (req->data) {
  535. usb_uas_complete_data_packet(req);
  536. }
  537. usb_uas_queue_sense(req, status);
  538. scsi_req_unref(req->req);
  539. }
  540. static void usb_uas_scsi_request_cancelled(SCSIRequest *r)
  541. {
  542. UASRequest *req = r->hba_private;
  543. /* FIXME: queue notification to status pipe? */
  544. scsi_req_unref(req->req);
  545. }
  546. static const struct SCSIBusInfo usb_uas_scsi_info = {
  547. .tcq = true,
  548. .max_target = 0,
  549. .max_lun = 255,
  550. .transfer_data = usb_uas_scsi_transfer_data,
  551. .complete = usb_uas_scsi_command_complete,
  552. .cancel = usb_uas_scsi_request_cancelled,
  553. .free_request = usb_uas_scsi_free_request,
  554. };
  555. /* --------------------------------------------------------------------- */
  556. static void usb_uas_handle_reset(USBDevice *dev)
  557. {
  558. UASDevice *uas = USB_UAS(dev);
  559. UASRequest *req, *nreq;
  560. UASStatus *st, *nst;
  561. trace_usb_uas_reset(dev->addr);
  562. QTAILQ_FOREACH_SAFE(req, &uas->requests, next, nreq) {
  563. scsi_req_cancel(req->req);
  564. }
  565. QTAILQ_FOREACH_SAFE(st, &uas->results, next, nst) {
  566. QTAILQ_REMOVE(&uas->results, st, next);
  567. g_free(st);
  568. }
  569. }
  570. static void usb_uas_handle_control(USBDevice *dev, USBPacket *p,
  571. int request, int value, int index, int length, uint8_t *data)
  572. {
  573. int ret;
  574. ret = usb_desc_handle_control(dev, p, request, value, index, length, data);
  575. if (ret >= 0) {
  576. return;
  577. }
  578. error_report("%s: unhandled control request (req 0x%x, val 0x%x, idx 0x%x",
  579. __func__, request, value, index);
  580. p->status = USB_RET_STALL;
  581. }
  582. static void usb_uas_cancel_io(USBDevice *dev, USBPacket *p)
  583. {
  584. UASDevice *uas = USB_UAS(dev);
  585. UASRequest *req, *nreq;
  586. int i;
  587. if (uas->status2 == p) {
  588. uas->status2 = NULL;
  589. qemu_bh_cancel(uas->status_bh);
  590. return;
  591. }
  592. if (uas_using_streams(uas)) {
  593. for (i = 0; i <= UAS_MAX_STREAMS; i++) {
  594. if (uas->status3[i] == p) {
  595. uas->status3[i] = NULL;
  596. return;
  597. }
  598. if (uas->data3[i] == p) {
  599. uas->data3[i] = NULL;
  600. return;
  601. }
  602. }
  603. }
  604. QTAILQ_FOREACH_SAFE(req, &uas->requests, next, nreq) {
  605. if (req->data == p) {
  606. req->data = NULL;
  607. return;
  608. }
  609. }
  610. assert(!"canceled usb packet not found");
  611. }
  612. static void usb_uas_command(UASDevice *uas, uas_iu *iu)
  613. {
  614. UASRequest *req;
  615. uint32_t len;
  616. uint16_t tag = be16_to_cpu(iu->hdr.tag);
  617. if (uas_using_streams(uas) && tag > UAS_MAX_STREAMS) {
  618. goto invalid_tag;
  619. }
  620. req = usb_uas_find_request(uas, tag);
  621. if (req) {
  622. goto overlapped_tag;
  623. }
  624. req = usb_uas_alloc_request(uas, iu);
  625. if (req->dev == NULL) {
  626. goto bad_target;
  627. }
  628. trace_usb_uas_command(uas->dev.addr, req->tag,
  629. usb_uas_get_lun(req->lun),
  630. req->lun >> 32, req->lun & 0xffffffff);
  631. QTAILQ_INSERT_TAIL(&uas->requests, req, next);
  632. if (uas_using_streams(uas) && uas->data3[req->tag] != NULL) {
  633. req->data = uas->data3[req->tag];
  634. req->data_async = true;
  635. uas->data3[req->tag] = NULL;
  636. }
  637. req->req = scsi_req_new(req->dev, req->tag,
  638. usb_uas_get_lun(req->lun),
  639. iu->command.cdb, req);
  640. if (uas->requestlog) {
  641. scsi_req_print(req->req);
  642. }
  643. len = scsi_req_enqueue(req->req);
  644. if (len) {
  645. req->data_size = len;
  646. scsi_req_continue(req->req);
  647. }
  648. return;
  649. invalid_tag:
  650. usb_uas_queue_fake_sense(uas, tag, sense_code_INVALID_TAG);
  651. return;
  652. overlapped_tag:
  653. usb_uas_queue_fake_sense(uas, tag, sense_code_OVERLAPPED_COMMANDS);
  654. return;
  655. bad_target:
  656. usb_uas_queue_fake_sense(uas, tag, sense_code_LUN_NOT_SUPPORTED);
  657. g_free(req);
  658. }
  659. static void usb_uas_task(UASDevice *uas, uas_iu *iu)
  660. {
  661. uint16_t tag = be16_to_cpu(iu->hdr.tag);
  662. uint64_t lun64 = be64_to_cpu(iu->task.lun);
  663. SCSIDevice *dev = usb_uas_get_dev(uas, lun64);
  664. int lun = usb_uas_get_lun(lun64);
  665. UASRequest *req;
  666. uint16_t task_tag;
  667. if (uas_using_streams(uas) && tag > UAS_MAX_STREAMS) {
  668. goto invalid_tag;
  669. }
  670. req = usb_uas_find_request(uas, be16_to_cpu(iu->hdr.tag));
  671. if (req) {
  672. goto overlapped_tag;
  673. }
  674. if (dev == NULL) {
  675. goto incorrect_lun;
  676. }
  677. switch (iu->task.function) {
  678. case UAS_TMF_ABORT_TASK:
  679. task_tag = be16_to_cpu(iu->task.task_tag);
  680. trace_usb_uas_tmf_abort_task(uas->dev.addr, tag, task_tag);
  681. req = usb_uas_find_request(uas, task_tag);
  682. if (req && req->dev == dev) {
  683. scsi_req_cancel(req->req);
  684. }
  685. usb_uas_queue_response(uas, tag, UAS_RC_TMF_COMPLETE);
  686. break;
  687. case UAS_TMF_LOGICAL_UNIT_RESET:
  688. trace_usb_uas_tmf_logical_unit_reset(uas->dev.addr, tag, lun);
  689. qdev_reset_all(&dev->qdev);
  690. usb_uas_queue_response(uas, tag, UAS_RC_TMF_COMPLETE);
  691. break;
  692. default:
  693. trace_usb_uas_tmf_unsupported(uas->dev.addr, tag, iu->task.function);
  694. usb_uas_queue_response(uas, tag, UAS_RC_TMF_NOT_SUPPORTED);
  695. break;
  696. }
  697. return;
  698. invalid_tag:
  699. usb_uas_queue_response(uas, tag, UAS_RC_INVALID_INFO_UNIT);
  700. return;
  701. overlapped_tag:
  702. usb_uas_queue_response(uas, req->tag, UAS_RC_OVERLAPPED_TAG);
  703. return;
  704. incorrect_lun:
  705. usb_uas_queue_response(uas, tag, UAS_RC_INCORRECT_LUN);
  706. }
  707. static void usb_uas_handle_data(USBDevice *dev, USBPacket *p)
  708. {
  709. UASDevice *uas = USB_UAS(dev);
  710. uas_iu iu;
  711. UASStatus *st;
  712. UASRequest *req;
  713. int length;
  714. switch (p->ep->nr) {
  715. case UAS_PIPE_ID_COMMAND:
  716. length = MIN(sizeof(iu), p->iov.size);
  717. usb_packet_copy(p, &iu, length);
  718. switch (iu.hdr.id) {
  719. case UAS_UI_COMMAND:
  720. usb_uas_command(uas, &iu);
  721. break;
  722. case UAS_UI_TASK_MGMT:
  723. usb_uas_task(uas, &iu);
  724. break;
  725. default:
  726. error_report("%s: unknown command iu: id 0x%x",
  727. __func__, iu.hdr.id);
  728. p->status = USB_RET_STALL;
  729. break;
  730. }
  731. break;
  732. case UAS_PIPE_ID_STATUS:
  733. if (p->stream) {
  734. QTAILQ_FOREACH(st, &uas->results, next) {
  735. if (st->stream == p->stream) {
  736. break;
  737. }
  738. }
  739. if (st == NULL) {
  740. assert(uas->status3[p->stream] == NULL);
  741. uas->status3[p->stream] = p;
  742. p->status = USB_RET_ASYNC;
  743. break;
  744. }
  745. } else {
  746. st = QTAILQ_FIRST(&uas->results);
  747. if (st == NULL) {
  748. assert(uas->status2 == NULL);
  749. uas->status2 = p;
  750. p->status = USB_RET_ASYNC;
  751. break;
  752. }
  753. }
  754. usb_packet_copy(p, &st->status, st->length);
  755. QTAILQ_REMOVE(&uas->results, st, next);
  756. g_free(st);
  757. break;
  758. case UAS_PIPE_ID_DATA_IN:
  759. case UAS_PIPE_ID_DATA_OUT:
  760. if (p->stream) {
  761. req = usb_uas_find_request(uas, p->stream);
  762. } else {
  763. req = (p->ep->nr == UAS_PIPE_ID_DATA_IN)
  764. ? uas->datain2 : uas->dataout2;
  765. }
  766. if (req == NULL) {
  767. if (p->stream) {
  768. assert(uas->data3[p->stream] == NULL);
  769. uas->data3[p->stream] = p;
  770. p->status = USB_RET_ASYNC;
  771. break;
  772. } else {
  773. error_report("%s: no inflight request", __func__);
  774. p->status = USB_RET_STALL;
  775. break;
  776. }
  777. }
  778. scsi_req_ref(req->req);
  779. req->data = p;
  780. usb_uas_copy_data(req);
  781. if (p->actual_length == p->iov.size || req->complete) {
  782. req->data = NULL;
  783. } else {
  784. req->data_async = true;
  785. p->status = USB_RET_ASYNC;
  786. }
  787. scsi_req_unref(req->req);
  788. usb_uas_start_next_transfer(uas);
  789. break;
  790. default:
  791. error_report("%s: invalid endpoint %d", __func__, p->ep->nr);
  792. p->status = USB_RET_STALL;
  793. break;
  794. }
  795. }
  796. static void usb_uas_unrealize(USBDevice *dev)
  797. {
  798. UASDevice *uas = USB_UAS(dev);
  799. qemu_bh_delete(uas->status_bh);
  800. }
  801. static void usb_uas_realize(USBDevice *dev, Error **errp)
  802. {
  803. UASDevice *uas = USB_UAS(dev);
  804. DeviceState *d = DEVICE(dev);
  805. usb_desc_create_serial(dev);
  806. usb_desc_init(dev);
  807. if (d->hotplugged) {
  808. uas->dev.auto_attach = 0;
  809. }
  810. QTAILQ_INIT(&uas->results);
  811. QTAILQ_INIT(&uas->requests);
  812. uas->status_bh = qemu_bh_new(usb_uas_send_status_bh, uas);
  813. scsi_bus_new(&uas->bus, sizeof(uas->bus), DEVICE(dev),
  814. &usb_uas_scsi_info, NULL);
  815. }
  816. static const VMStateDescription vmstate_usb_uas = {
  817. .name = "usb-uas",
  818. .unmigratable = 1,
  819. .fields = (VMStateField[]) {
  820. VMSTATE_USB_DEVICE(dev, UASDevice),
  821. VMSTATE_END_OF_LIST()
  822. }
  823. };
  824. static Property uas_properties[] = {
  825. DEFINE_PROP_UINT32("log-scsi-req", UASDevice, requestlog, 0),
  826. DEFINE_PROP_END_OF_LIST(),
  827. };
  828. static void usb_uas_class_initfn(ObjectClass *klass, void *data)
  829. {
  830. DeviceClass *dc = DEVICE_CLASS(klass);
  831. USBDeviceClass *uc = USB_DEVICE_CLASS(klass);
  832. uc->realize = usb_uas_realize;
  833. uc->product_desc = desc_strings[STR_PRODUCT];
  834. uc->usb_desc = &desc;
  835. uc->cancel_packet = usb_uas_cancel_io;
  836. uc->handle_attach = usb_desc_attach;
  837. uc->handle_reset = usb_uas_handle_reset;
  838. uc->handle_control = usb_uas_handle_control;
  839. uc->handle_data = usb_uas_handle_data;
  840. uc->unrealize = usb_uas_unrealize;
  841. uc->attached_settable = true;
  842. set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
  843. dc->fw_name = "storage";
  844. dc->vmsd = &vmstate_usb_uas;
  845. device_class_set_props(dc, uas_properties);
  846. }
  847. static const TypeInfo uas_info = {
  848. .name = TYPE_USB_UAS,
  849. .parent = TYPE_USB_DEVICE,
  850. .instance_size = sizeof(UASDevice),
  851. .class_init = usb_uas_class_initfn,
  852. };
  853. static void usb_uas_register_types(void)
  854. {
  855. type_register_static(&uas_info);
  856. }
  857. type_init(usb_uas_register_types)