dev-uas.c 28 KB

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