2
0

scsi-bus.c 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395
  1. #include "hw.h"
  2. #include "qemu-error.h"
  3. #include "scsi.h"
  4. #include "scsi-defs.h"
  5. #include "qdev.h"
  6. #include "blockdev.h"
  7. #include "trace.h"
  8. static char *scsibus_get_fw_dev_path(DeviceState *dev);
  9. static int scsi_req_parse(SCSICommand *cmd, SCSIDevice *dev, uint8_t *buf);
  10. static void scsi_req_dequeue(SCSIRequest *req);
  11. static struct BusInfo scsi_bus_info = {
  12. .name = "SCSI",
  13. .size = sizeof(SCSIBus),
  14. .get_fw_dev_path = scsibus_get_fw_dev_path,
  15. .props = (Property[]) {
  16. DEFINE_PROP_UINT32("channel", SCSIDevice, channel, 0),
  17. DEFINE_PROP_UINT32("scsi-id", SCSIDevice, id, -1),
  18. DEFINE_PROP_UINT32("lun", SCSIDevice, lun, -1),
  19. DEFINE_PROP_END_OF_LIST(),
  20. },
  21. };
  22. static int next_scsi_bus;
  23. /* Create a scsi bus, and attach devices to it. */
  24. void scsi_bus_new(SCSIBus *bus, DeviceState *host, const SCSIBusInfo *info)
  25. {
  26. qbus_create_inplace(&bus->qbus, &scsi_bus_info, host, NULL);
  27. bus->busnr = next_scsi_bus++;
  28. bus->info = info;
  29. bus->qbus.allow_hotplug = 1;
  30. }
  31. static void scsi_dma_restart_bh(void *opaque)
  32. {
  33. SCSIDevice *s = opaque;
  34. SCSIRequest *req, *next;
  35. qemu_bh_delete(s->bh);
  36. s->bh = NULL;
  37. QTAILQ_FOREACH_SAFE(req, &s->requests, next, next) {
  38. scsi_req_ref(req);
  39. if (req->retry) {
  40. req->retry = false;
  41. switch (req->cmd.mode) {
  42. case SCSI_XFER_FROM_DEV:
  43. case SCSI_XFER_TO_DEV:
  44. scsi_req_continue(req);
  45. break;
  46. case SCSI_XFER_NONE:
  47. scsi_req_dequeue(req);
  48. scsi_req_enqueue(req);
  49. break;
  50. }
  51. }
  52. scsi_req_unref(req);
  53. }
  54. }
  55. void scsi_req_retry(SCSIRequest *req)
  56. {
  57. /* No need to save a reference, because scsi_dma_restart_bh just
  58. * looks at the request list. */
  59. req->retry = true;
  60. }
  61. static void scsi_dma_restart_cb(void *opaque, int running, RunState state)
  62. {
  63. SCSIDevice *s = opaque;
  64. if (!running) {
  65. return;
  66. }
  67. if (!s->bh) {
  68. s->bh = qemu_bh_new(scsi_dma_restart_bh, s);
  69. qemu_bh_schedule(s->bh);
  70. }
  71. }
  72. static int scsi_qdev_init(DeviceState *qdev, DeviceInfo *base)
  73. {
  74. SCSIDevice *dev = DO_UPCAST(SCSIDevice, qdev, qdev);
  75. SCSIDeviceInfo *info = DO_UPCAST(SCSIDeviceInfo, qdev, base);
  76. SCSIBus *bus = DO_UPCAST(SCSIBus, qbus, dev->qdev.parent_bus);
  77. SCSIDevice *d;
  78. int rc = -1;
  79. if (dev->channel > bus->info->max_channel) {
  80. error_report("bad scsi channel id: %d", dev->channel);
  81. goto err;
  82. }
  83. if (dev->id != -1 && dev->id > bus->info->max_target) {
  84. error_report("bad scsi device id: %d", dev->id);
  85. goto err;
  86. }
  87. if (dev->id == -1) {
  88. int id = -1;
  89. if (dev->lun == -1) {
  90. dev->lun = 0;
  91. }
  92. do {
  93. d = scsi_device_find(bus, dev->channel, ++id, dev->lun);
  94. } while (d && d->lun == dev->lun && id <= bus->info->max_target);
  95. if (id > bus->info->max_target) {
  96. error_report("no free target");
  97. goto err;
  98. }
  99. dev->id = id;
  100. } else if (dev->lun == -1) {
  101. int lun = -1;
  102. do {
  103. d = scsi_device_find(bus, dev->channel, dev->id, ++lun);
  104. } while (d && d->lun == lun && lun < bus->info->max_lun);
  105. if (lun > bus->info->max_lun) {
  106. error_report("no free lun");
  107. goto err;
  108. }
  109. dev->lun = lun;
  110. } else {
  111. d = scsi_device_find(bus, dev->channel, dev->id, dev->lun);
  112. if (dev->lun == d->lun && dev != d) {
  113. qdev_free(&d->qdev);
  114. }
  115. }
  116. dev->info = info;
  117. QTAILQ_INIT(&dev->requests);
  118. rc = dev->info->init(dev);
  119. if (rc == 0) {
  120. dev->vmsentry = qemu_add_vm_change_state_handler(scsi_dma_restart_cb,
  121. dev);
  122. }
  123. err:
  124. return rc;
  125. }
  126. static int scsi_qdev_exit(DeviceState *qdev)
  127. {
  128. SCSIDevice *dev = DO_UPCAST(SCSIDevice, qdev, qdev);
  129. if (dev->vmsentry) {
  130. qemu_del_vm_change_state_handler(dev->vmsentry);
  131. }
  132. if (dev->info->destroy) {
  133. dev->info->destroy(dev);
  134. }
  135. return 0;
  136. }
  137. void scsi_qdev_register(SCSIDeviceInfo *info)
  138. {
  139. info->qdev.bus_info = &scsi_bus_info;
  140. info->qdev.init = scsi_qdev_init;
  141. info->qdev.unplug = qdev_simple_unplug_cb;
  142. info->qdev.exit = scsi_qdev_exit;
  143. qdev_register(&info->qdev);
  144. }
  145. /* handle legacy '-drive if=scsi,...' cmd line args */
  146. SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockDriverState *bdrv,
  147. int unit, bool removable, int bootindex)
  148. {
  149. const char *driver;
  150. DeviceState *dev;
  151. driver = bdrv_is_sg(bdrv) ? "scsi-generic" : "scsi-disk";
  152. dev = qdev_create(&bus->qbus, driver);
  153. qdev_prop_set_uint32(dev, "scsi-id", unit);
  154. if (bootindex >= 0) {
  155. qdev_prop_set_int32(dev, "bootindex", bootindex);
  156. }
  157. if (qdev_prop_exists(dev, "removable")) {
  158. qdev_prop_set_bit(dev, "removable", removable);
  159. }
  160. if (qdev_prop_set_drive(dev, "drive", bdrv) < 0) {
  161. qdev_free(dev);
  162. return NULL;
  163. }
  164. if (qdev_init(dev) < 0)
  165. return NULL;
  166. return DO_UPCAST(SCSIDevice, qdev, dev);
  167. }
  168. int scsi_bus_legacy_handle_cmdline(SCSIBus *bus)
  169. {
  170. Location loc;
  171. DriveInfo *dinfo;
  172. int res = 0, unit;
  173. loc_push_none(&loc);
  174. for (unit = 0; unit < bus->info->max_target; unit++) {
  175. dinfo = drive_get(IF_SCSI, bus->busnr, unit);
  176. if (dinfo == NULL) {
  177. continue;
  178. }
  179. qemu_opts_loc_restore(dinfo->opts);
  180. if (!scsi_bus_legacy_add_drive(bus, dinfo->bdrv, unit, false, -1)) {
  181. res = -1;
  182. break;
  183. }
  184. }
  185. loc_pop(&loc);
  186. return res;
  187. }
  188. /* SCSIReqOps implementation for invalid commands. */
  189. static int32_t scsi_invalid_command(SCSIRequest *req, uint8_t *buf)
  190. {
  191. scsi_req_build_sense(req, SENSE_CODE(INVALID_OPCODE));
  192. scsi_req_complete(req, CHECK_CONDITION);
  193. return 0;
  194. }
  195. static const struct SCSIReqOps reqops_invalid_opcode = {
  196. .size = sizeof(SCSIRequest),
  197. .send_command = scsi_invalid_command
  198. };
  199. /* SCSIReqOps implementation for unit attention conditions. */
  200. static int32_t scsi_unit_attention(SCSIRequest *req, uint8_t *buf)
  201. {
  202. if (req->dev && req->dev->unit_attention.key == UNIT_ATTENTION) {
  203. scsi_req_build_sense(req, req->dev->unit_attention);
  204. } else if (req->bus->unit_attention.key == UNIT_ATTENTION) {
  205. scsi_req_build_sense(req, req->bus->unit_attention);
  206. }
  207. scsi_req_complete(req, CHECK_CONDITION);
  208. return 0;
  209. }
  210. static const struct SCSIReqOps reqops_unit_attention = {
  211. .size = sizeof(SCSIRequest),
  212. .send_command = scsi_unit_attention
  213. };
  214. /* SCSIReqOps implementation for REPORT LUNS and for commands sent to
  215. an invalid LUN. */
  216. typedef struct SCSITargetReq SCSITargetReq;
  217. struct SCSITargetReq {
  218. SCSIRequest req;
  219. int len;
  220. uint8_t buf[2056];
  221. };
  222. static void store_lun(uint8_t *outbuf, int lun)
  223. {
  224. if (lun < 256) {
  225. outbuf[1] = lun;
  226. return;
  227. }
  228. outbuf[1] = (lun & 255);
  229. outbuf[0] = (lun >> 8) | 0x40;
  230. }
  231. static bool scsi_target_emulate_report_luns(SCSITargetReq *r)
  232. {
  233. DeviceState *qdev;
  234. int i, len, n;
  235. int channel, id;
  236. bool found_lun0;
  237. if (r->req.cmd.xfer < 16) {
  238. return false;
  239. }
  240. if (r->req.cmd.buf[2] > 2) {
  241. return false;
  242. }
  243. channel = r->req.dev->channel;
  244. id = r->req.dev->id;
  245. found_lun0 = false;
  246. n = 0;
  247. QTAILQ_FOREACH(qdev, &r->req.bus->qbus.children, sibling) {
  248. SCSIDevice *dev = DO_UPCAST(SCSIDevice, qdev, qdev);
  249. if (dev->channel == channel && dev->id == id) {
  250. if (dev->lun == 0) {
  251. found_lun0 = true;
  252. }
  253. n += 8;
  254. }
  255. }
  256. if (!found_lun0) {
  257. n += 8;
  258. }
  259. len = MIN(n + 8, r->req.cmd.xfer & ~7);
  260. if (len > sizeof(r->buf)) {
  261. /* TODO: > 256 LUNs? */
  262. return false;
  263. }
  264. memset(r->buf, 0, len);
  265. stl_be_p(&r->buf, n);
  266. i = found_lun0 ? 8 : 16;
  267. QTAILQ_FOREACH(qdev, &r->req.bus->qbus.children, sibling) {
  268. SCSIDevice *dev = DO_UPCAST(SCSIDevice, qdev, qdev);
  269. if (dev->channel == channel && dev->id == id) {
  270. store_lun(&r->buf[i], dev->lun);
  271. i += 8;
  272. }
  273. }
  274. assert(i == n + 8);
  275. r->len = len;
  276. return true;
  277. }
  278. static bool scsi_target_emulate_inquiry(SCSITargetReq *r)
  279. {
  280. assert(r->req.dev->lun != r->req.lun);
  281. if (r->req.cmd.buf[1] & 0x2) {
  282. /* Command support data - optional, not implemented */
  283. return false;
  284. }
  285. if (r->req.cmd.buf[1] & 0x1) {
  286. /* Vital product data */
  287. uint8_t page_code = r->req.cmd.buf[2];
  288. if (r->req.cmd.xfer < 4) {
  289. return false;
  290. }
  291. r->buf[r->len++] = page_code ; /* this page */
  292. r->buf[r->len++] = 0x00;
  293. switch (page_code) {
  294. case 0x00: /* Supported page codes, mandatory */
  295. {
  296. int pages;
  297. pages = r->len++;
  298. r->buf[r->len++] = 0x00; /* list of supported pages (this page) */
  299. r->buf[pages] = r->len - pages - 1; /* number of pages */
  300. break;
  301. }
  302. default:
  303. return false;
  304. }
  305. /* done with EVPD */
  306. assert(r->len < sizeof(r->buf));
  307. r->len = MIN(r->req.cmd.xfer, r->len);
  308. return true;
  309. }
  310. /* Standard INQUIRY data */
  311. if (r->req.cmd.buf[2] != 0) {
  312. return false;
  313. }
  314. /* PAGE CODE == 0 */
  315. if (r->req.cmd.xfer < 5) {
  316. return -1;
  317. }
  318. r->len = MIN(r->req.cmd.xfer, 36);
  319. memset(r->buf, 0, r->len);
  320. if (r->req.lun != 0) {
  321. r->buf[0] = TYPE_NO_LUN;
  322. } else {
  323. r->buf[0] = TYPE_NOT_PRESENT | TYPE_INACTIVE;
  324. r->buf[2] = 5; /* Version */
  325. r->buf[3] = 2 | 0x10; /* HiSup, response data format */
  326. r->buf[4] = r->len - 5; /* Additional Length = (Len - 1) - 4 */
  327. r->buf[7] = 0x10 | (r->req.bus->info->tcq ? 0x02 : 0); /* Sync, TCQ. */
  328. memcpy(&r->buf[8], "QEMU ", 8);
  329. memcpy(&r->buf[16], "QEMU TARGET ", 16);
  330. strncpy((char *) &r->buf[32], QEMU_VERSION, 4);
  331. }
  332. return true;
  333. }
  334. static int32_t scsi_target_send_command(SCSIRequest *req, uint8_t *buf)
  335. {
  336. SCSITargetReq *r = DO_UPCAST(SCSITargetReq, req, req);
  337. switch (buf[0]) {
  338. case REPORT_LUNS:
  339. if (!scsi_target_emulate_report_luns(r)) {
  340. goto illegal_request;
  341. }
  342. break;
  343. case INQUIRY:
  344. if (!scsi_target_emulate_inquiry(r)) {
  345. goto illegal_request;
  346. }
  347. break;
  348. case REQUEST_SENSE:
  349. if (req->cmd.xfer < 4) {
  350. goto illegal_request;
  351. }
  352. r->len = scsi_device_get_sense(r->req.dev, r->buf,
  353. MIN(req->cmd.xfer, sizeof r->buf),
  354. (req->cmd.buf[1] & 1) == 0);
  355. if (r->req.dev->sense_is_ua) {
  356. if (r->req.dev->info->unit_attention_reported) {
  357. r->req.dev->info->unit_attention_reported(req->dev);
  358. }
  359. r->req.dev->sense_len = 0;
  360. r->req.dev->sense_is_ua = false;
  361. }
  362. break;
  363. default:
  364. scsi_req_build_sense(req, SENSE_CODE(LUN_NOT_SUPPORTED));
  365. scsi_req_complete(req, CHECK_CONDITION);
  366. return 0;
  367. illegal_request:
  368. scsi_req_build_sense(req, SENSE_CODE(INVALID_FIELD));
  369. scsi_req_complete(req, CHECK_CONDITION);
  370. return 0;
  371. }
  372. if (!r->len) {
  373. scsi_req_complete(req, GOOD);
  374. }
  375. return r->len;
  376. }
  377. static void scsi_target_read_data(SCSIRequest *req)
  378. {
  379. SCSITargetReq *r = DO_UPCAST(SCSITargetReq, req, req);
  380. uint32_t n;
  381. n = r->len;
  382. if (n > 0) {
  383. r->len = 0;
  384. scsi_req_data(&r->req, n);
  385. } else {
  386. scsi_req_complete(&r->req, GOOD);
  387. }
  388. }
  389. static uint8_t *scsi_target_get_buf(SCSIRequest *req)
  390. {
  391. SCSITargetReq *r = DO_UPCAST(SCSITargetReq, req, req);
  392. return r->buf;
  393. }
  394. static const struct SCSIReqOps reqops_target_command = {
  395. .size = sizeof(SCSITargetReq),
  396. .send_command = scsi_target_send_command,
  397. .read_data = scsi_target_read_data,
  398. .get_buf = scsi_target_get_buf,
  399. };
  400. SCSIRequest *scsi_req_alloc(const SCSIReqOps *reqops, SCSIDevice *d,
  401. uint32_t tag, uint32_t lun, void *hba_private)
  402. {
  403. SCSIRequest *req;
  404. req = g_malloc0(reqops->size);
  405. req->refcount = 1;
  406. req->bus = scsi_bus_from_device(d);
  407. req->dev = d;
  408. req->tag = tag;
  409. req->lun = lun;
  410. req->hba_private = hba_private;
  411. req->status = -1;
  412. req->sense_len = 0;
  413. req->ops = reqops;
  414. trace_scsi_req_alloc(req->dev->id, req->lun, req->tag);
  415. return req;
  416. }
  417. SCSIRequest *scsi_req_new(SCSIDevice *d, uint32_t tag, uint32_t lun,
  418. uint8_t *buf, void *hba_private)
  419. {
  420. SCSIBus *bus = DO_UPCAST(SCSIBus, qbus, d->qdev.parent_bus);
  421. SCSIRequest *req;
  422. SCSICommand cmd;
  423. if (scsi_req_parse(&cmd, d, buf) != 0) {
  424. trace_scsi_req_parse_bad(d->id, lun, tag, buf[0]);
  425. req = scsi_req_alloc(&reqops_invalid_opcode, d, tag, lun, hba_private);
  426. } else {
  427. trace_scsi_req_parsed(d->id, lun, tag, buf[0],
  428. cmd.mode, cmd.xfer);
  429. if (cmd.lba != -1) {
  430. trace_scsi_req_parsed_lba(d->id, lun, tag, buf[0],
  431. cmd.lba);
  432. }
  433. if ((d->unit_attention.key == UNIT_ATTENTION ||
  434. bus->unit_attention.key == UNIT_ATTENTION) &&
  435. (buf[0] != INQUIRY &&
  436. buf[0] != REPORT_LUNS &&
  437. buf[0] != GET_CONFIGURATION &&
  438. buf[0] != GET_EVENT_STATUS_NOTIFICATION &&
  439. /*
  440. * If we already have a pending unit attention condition,
  441. * report this one before triggering another one.
  442. */
  443. !(buf[0] == REQUEST_SENSE && d->sense_is_ua))) {
  444. req = scsi_req_alloc(&reqops_unit_attention, d, tag, lun,
  445. hba_private);
  446. } else if (lun != d->lun ||
  447. buf[0] == REPORT_LUNS ||
  448. (buf[0] == REQUEST_SENSE && (d->sense_len || cmd.xfer < 4))) {
  449. req = scsi_req_alloc(&reqops_target_command, d, tag, lun,
  450. hba_private);
  451. } else {
  452. req = d->info->alloc_req(d, tag, lun, buf, hba_private);
  453. }
  454. }
  455. req->cmd = cmd;
  456. switch (buf[0]) {
  457. case INQUIRY:
  458. trace_scsi_inquiry(d->id, lun, tag, cmd.buf[1], cmd.buf[2]);
  459. break;
  460. case TEST_UNIT_READY:
  461. trace_scsi_test_unit_ready(d->id, lun, tag);
  462. break;
  463. case REPORT_LUNS:
  464. trace_scsi_report_luns(d->id, lun, tag);
  465. break;
  466. case REQUEST_SENSE:
  467. trace_scsi_request_sense(d->id, lun, tag);
  468. break;
  469. default:
  470. break;
  471. }
  472. return req;
  473. }
  474. uint8_t *scsi_req_get_buf(SCSIRequest *req)
  475. {
  476. return req->ops->get_buf(req);
  477. }
  478. static void scsi_clear_unit_attention(SCSIRequest *req)
  479. {
  480. SCSISense *ua;
  481. if (req->dev->unit_attention.key != UNIT_ATTENTION &&
  482. req->bus->unit_attention.key != UNIT_ATTENTION) {
  483. return;
  484. }
  485. /*
  486. * If an INQUIRY command enters the enabled command state,
  487. * the device server shall [not] clear any unit attention condition;
  488. * See also MMC-6, paragraphs 6.5 and 6.6.2.
  489. */
  490. if (req->cmd.buf[0] == INQUIRY ||
  491. req->cmd.buf[0] == GET_CONFIGURATION ||
  492. req->cmd.buf[0] == GET_EVENT_STATUS_NOTIFICATION) {
  493. return;
  494. }
  495. if (req->dev->unit_attention.key == UNIT_ATTENTION) {
  496. ua = &req->dev->unit_attention;
  497. } else {
  498. ua = &req->bus->unit_attention;
  499. }
  500. /*
  501. * If a REPORT LUNS command enters the enabled command state, [...]
  502. * the device server shall clear any pending unit attention condition
  503. * with an additional sense code of REPORTED LUNS DATA HAS CHANGED.
  504. */
  505. if (req->cmd.buf[0] == REPORT_LUNS &&
  506. !(ua->asc == SENSE_CODE(REPORTED_LUNS_CHANGED).asc &&
  507. ua->ascq == SENSE_CODE(REPORTED_LUNS_CHANGED).ascq)) {
  508. return;
  509. }
  510. *ua = SENSE_CODE(NO_SENSE);
  511. }
  512. int scsi_req_get_sense(SCSIRequest *req, uint8_t *buf, int len)
  513. {
  514. int ret;
  515. assert(len >= 14);
  516. if (!req->sense_len) {
  517. return 0;
  518. }
  519. ret = scsi_build_sense(req->sense, req->sense_len, buf, len, true);
  520. /*
  521. * FIXME: clearing unit attention conditions upon autosense should be done
  522. * only if the UA_INTLCK_CTRL field in the Control mode page is set to 00b
  523. * (SAM-5, 5.14).
  524. *
  525. * We assume UA_INTLCK_CTRL to be 00b for HBAs that support autosense, and
  526. * 10b for HBAs that do not support it (do not call scsi_req_get_sense).
  527. * Here we handle unit attention clearing for UA_INTLCK_CTRL == 00b.
  528. */
  529. if (req->dev->sense_is_ua) {
  530. if (req->dev->info->unit_attention_reported) {
  531. req->dev->info->unit_attention_reported(req->dev);
  532. }
  533. req->dev->sense_len = 0;
  534. req->dev->sense_is_ua = false;
  535. }
  536. return ret;
  537. }
  538. int scsi_device_get_sense(SCSIDevice *dev, uint8_t *buf, int len, bool fixed)
  539. {
  540. return scsi_build_sense(dev->sense, dev->sense_len, buf, len, fixed);
  541. }
  542. void scsi_req_build_sense(SCSIRequest *req, SCSISense sense)
  543. {
  544. trace_scsi_req_build_sense(req->dev->id, req->lun, req->tag,
  545. sense.key, sense.asc, sense.ascq);
  546. memset(req->sense, 0, 18);
  547. req->sense[0] = 0xf0;
  548. req->sense[2] = sense.key;
  549. req->sense[7] = 10;
  550. req->sense[12] = sense.asc;
  551. req->sense[13] = sense.ascq;
  552. req->sense_len = 18;
  553. }
  554. int32_t scsi_req_enqueue(SCSIRequest *req)
  555. {
  556. int32_t rc;
  557. assert(!req->enqueued);
  558. scsi_req_ref(req);
  559. req->enqueued = true;
  560. QTAILQ_INSERT_TAIL(&req->dev->requests, req, next);
  561. scsi_req_ref(req);
  562. rc = req->ops->send_command(req, req->cmd.buf);
  563. scsi_req_unref(req);
  564. return rc;
  565. }
  566. static void scsi_req_dequeue(SCSIRequest *req)
  567. {
  568. trace_scsi_req_dequeue(req->dev->id, req->lun, req->tag);
  569. req->retry = false;
  570. if (req->enqueued) {
  571. QTAILQ_REMOVE(&req->dev->requests, req, next);
  572. req->enqueued = false;
  573. scsi_req_unref(req);
  574. }
  575. }
  576. static int scsi_get_performance_length(int num_desc, int type, int data_type)
  577. {
  578. /* MMC-6, paragraph 6.7. */
  579. switch (type) {
  580. case 0:
  581. if ((data_type & 3) == 0) {
  582. /* Each descriptor is as in Table 295 - Nominal performance. */
  583. return 16 * num_desc + 8;
  584. } else {
  585. /* Each descriptor is as in Table 296 - Exceptions. */
  586. return 6 * num_desc + 8;
  587. }
  588. case 1:
  589. case 4:
  590. case 5:
  591. return 8 * num_desc + 8;
  592. case 2:
  593. return 2048 * num_desc + 8;
  594. case 3:
  595. return 16 * num_desc + 8;
  596. default:
  597. return 8;
  598. }
  599. }
  600. static int scsi_req_length(SCSICommand *cmd, SCSIDevice *dev, uint8_t *buf)
  601. {
  602. switch (buf[0] >> 5) {
  603. case 0:
  604. cmd->xfer = buf[4];
  605. cmd->len = 6;
  606. /* length 0 means 256 blocks */
  607. if (cmd->xfer == 0) {
  608. cmd->xfer = 256;
  609. }
  610. break;
  611. case 1:
  612. case 2:
  613. cmd->xfer = lduw_be_p(&buf[7]);
  614. cmd->len = 10;
  615. break;
  616. case 4:
  617. cmd->xfer = ldl_be_p(&buf[10]) & 0xffffffffULL;
  618. cmd->len = 16;
  619. break;
  620. case 5:
  621. cmd->xfer = ldl_be_p(&buf[6]) & 0xffffffffULL;
  622. cmd->len = 12;
  623. break;
  624. default:
  625. return -1;
  626. }
  627. switch (buf[0]) {
  628. case TEST_UNIT_READY:
  629. case REWIND:
  630. case START_STOP:
  631. case SET_CAPACITY:
  632. case WRITE_FILEMARKS:
  633. case WRITE_FILEMARKS_16:
  634. case SPACE:
  635. case RESERVE:
  636. case RELEASE:
  637. case ERASE:
  638. case ALLOW_MEDIUM_REMOVAL:
  639. case VERIFY_10:
  640. case SEEK_10:
  641. case SYNCHRONIZE_CACHE:
  642. case SYNCHRONIZE_CACHE_16:
  643. case LOCATE_16:
  644. case LOCK_UNLOCK_CACHE:
  645. case LOAD_UNLOAD:
  646. case SET_CD_SPEED:
  647. case SET_LIMITS:
  648. case WRITE_LONG_10:
  649. case MOVE_MEDIUM:
  650. case UPDATE_BLOCK:
  651. case RESERVE_TRACK:
  652. case SET_READ_AHEAD:
  653. case PRE_FETCH:
  654. case PRE_FETCH_16:
  655. case ALLOW_OVERWRITE:
  656. cmd->xfer = 0;
  657. break;
  658. case MODE_SENSE:
  659. break;
  660. case WRITE_SAME_10:
  661. cmd->xfer = 1;
  662. break;
  663. case READ_CAPACITY_10:
  664. cmd->xfer = 8;
  665. break;
  666. case READ_BLOCK_LIMITS:
  667. cmd->xfer = 6;
  668. break;
  669. case SEND_VOLUME_TAG:
  670. /* GPCMD_SET_STREAMING from multimedia commands. */
  671. if (dev->type == TYPE_ROM) {
  672. cmd->xfer = buf[10] | (buf[9] << 8);
  673. } else {
  674. cmd->xfer = buf[9] | (buf[8] << 8);
  675. }
  676. break;
  677. case WRITE_10:
  678. case WRITE_VERIFY_10:
  679. case WRITE_6:
  680. case WRITE_12:
  681. case WRITE_VERIFY_12:
  682. case WRITE_16:
  683. case WRITE_VERIFY_16:
  684. cmd->xfer *= dev->blocksize;
  685. break;
  686. case READ_10:
  687. case READ_6:
  688. case READ_REVERSE:
  689. case RECOVER_BUFFERED_DATA:
  690. case READ_12:
  691. case READ_16:
  692. cmd->xfer *= dev->blocksize;
  693. break;
  694. case FORMAT_UNIT:
  695. /* MMC mandates the parameter list to be 12-bytes long. Parameters
  696. * for block devices are restricted to the header right now. */
  697. if (dev->type == TYPE_ROM && (buf[1] & 16)) {
  698. cmd->xfer = 12;
  699. } else {
  700. cmd->xfer = (buf[1] & 16) == 0 ? 0 : (buf[1] & 32 ? 8 : 4);
  701. }
  702. break;
  703. case INQUIRY:
  704. case RECEIVE_DIAGNOSTIC:
  705. case SEND_DIAGNOSTIC:
  706. cmd->xfer = buf[4] | (buf[3] << 8);
  707. break;
  708. case READ_CD:
  709. case READ_BUFFER:
  710. case WRITE_BUFFER:
  711. case SEND_CUE_SHEET:
  712. cmd->xfer = buf[8] | (buf[7] << 8) | (buf[6] << 16);
  713. break;
  714. case PERSISTENT_RESERVE_OUT:
  715. cmd->xfer = ldl_be_p(&buf[5]) & 0xffffffffULL;
  716. break;
  717. case ERASE_12:
  718. if (dev->type == TYPE_ROM) {
  719. /* MMC command GET PERFORMANCE. */
  720. cmd->xfer = scsi_get_performance_length(buf[9] | (buf[8] << 8),
  721. buf[10], buf[1] & 0x1f);
  722. }
  723. break;
  724. case MECHANISM_STATUS:
  725. case READ_DVD_STRUCTURE:
  726. case SEND_DVD_STRUCTURE:
  727. case MAINTENANCE_OUT:
  728. case MAINTENANCE_IN:
  729. if (dev->type == TYPE_ROM) {
  730. /* GPCMD_REPORT_KEY and GPCMD_SEND_KEY from multi media commands */
  731. cmd->xfer = buf[9] | (buf[8] << 8);
  732. }
  733. break;
  734. }
  735. return 0;
  736. }
  737. static int scsi_req_stream_length(SCSICommand *cmd, SCSIDevice *dev, uint8_t *buf)
  738. {
  739. switch (buf[0]) {
  740. /* stream commands */
  741. case ERASE_12:
  742. case ERASE_16:
  743. cmd->xfer = 0;
  744. break;
  745. case READ_6:
  746. case READ_REVERSE:
  747. case RECOVER_BUFFERED_DATA:
  748. case WRITE_6:
  749. cmd->len = 6;
  750. cmd->xfer = buf[4] | (buf[3] << 8) | (buf[2] << 16);
  751. if (buf[1] & 0x01) { /* fixed */
  752. cmd->xfer *= dev->blocksize;
  753. }
  754. break;
  755. case REWIND:
  756. case START_STOP:
  757. cmd->len = 6;
  758. cmd->xfer = 0;
  759. break;
  760. case SPACE_16:
  761. cmd->xfer = buf[13] | (buf[12] << 8);
  762. break;
  763. case READ_POSITION:
  764. cmd->xfer = buf[8] | (buf[7] << 8);
  765. break;
  766. case FORMAT_UNIT:
  767. cmd->xfer = buf[4] | (buf[3] << 8);
  768. break;
  769. /* generic commands */
  770. default:
  771. return scsi_req_length(cmd, dev, buf);
  772. }
  773. return 0;
  774. }
  775. static void scsi_cmd_xfer_mode(SCSICommand *cmd)
  776. {
  777. switch (cmd->buf[0]) {
  778. case WRITE_6:
  779. case WRITE_10:
  780. case WRITE_VERIFY_10:
  781. case WRITE_12:
  782. case WRITE_VERIFY_12:
  783. case WRITE_16:
  784. case WRITE_VERIFY_16:
  785. case COPY:
  786. case COPY_VERIFY:
  787. case COMPARE:
  788. case CHANGE_DEFINITION:
  789. case LOG_SELECT:
  790. case MODE_SELECT:
  791. case MODE_SELECT_10:
  792. case SEND_DIAGNOSTIC:
  793. case WRITE_BUFFER:
  794. case FORMAT_UNIT:
  795. case REASSIGN_BLOCKS:
  796. case SEARCH_EQUAL:
  797. case SEARCH_HIGH:
  798. case SEARCH_LOW:
  799. case UPDATE_BLOCK:
  800. case WRITE_LONG_10:
  801. case WRITE_SAME_10:
  802. case SEARCH_HIGH_12:
  803. case SEARCH_EQUAL_12:
  804. case SEARCH_LOW_12:
  805. case MEDIUM_SCAN:
  806. case SEND_VOLUME_TAG:
  807. case SEND_CUE_SHEET:
  808. case SEND_DVD_STRUCTURE:
  809. case PERSISTENT_RESERVE_OUT:
  810. case MAINTENANCE_OUT:
  811. cmd->mode = SCSI_XFER_TO_DEV;
  812. break;
  813. default:
  814. if (cmd->xfer)
  815. cmd->mode = SCSI_XFER_FROM_DEV;
  816. else {
  817. cmd->mode = SCSI_XFER_NONE;
  818. }
  819. break;
  820. }
  821. }
  822. static uint64_t scsi_cmd_lba(SCSICommand *cmd)
  823. {
  824. uint8_t *buf = cmd->buf;
  825. uint64_t lba;
  826. switch (buf[0] >> 5) {
  827. case 0:
  828. lba = ldl_be_p(&buf[0]) & 0x1fffff;
  829. break;
  830. case 1:
  831. case 2:
  832. case 5:
  833. lba = ldl_be_p(&buf[2]) & 0xffffffffULL;
  834. break;
  835. case 4:
  836. lba = ldq_be_p(&buf[2]);
  837. break;
  838. default:
  839. lba = -1;
  840. }
  841. return lba;
  842. }
  843. int scsi_req_parse(SCSICommand *cmd, SCSIDevice *dev, uint8_t *buf)
  844. {
  845. int rc;
  846. if (dev->type == TYPE_TAPE) {
  847. rc = scsi_req_stream_length(cmd, dev, buf);
  848. } else {
  849. rc = scsi_req_length(cmd, dev, buf);
  850. }
  851. if (rc != 0)
  852. return rc;
  853. memcpy(cmd->buf, buf, cmd->len);
  854. scsi_cmd_xfer_mode(cmd);
  855. cmd->lba = scsi_cmd_lba(cmd);
  856. return 0;
  857. }
  858. /*
  859. * Predefined sense codes
  860. */
  861. /* No sense data available */
  862. const struct SCSISense sense_code_NO_SENSE = {
  863. .key = NO_SENSE , .asc = 0x00 , .ascq = 0x00
  864. };
  865. /* LUN not ready, Manual intervention required */
  866. const struct SCSISense sense_code_LUN_NOT_READY = {
  867. .key = NOT_READY, .asc = 0x04, .ascq = 0x03
  868. };
  869. /* LUN not ready, Medium not present */
  870. const struct SCSISense sense_code_NO_MEDIUM = {
  871. .key = NOT_READY, .asc = 0x3a, .ascq = 0x00
  872. };
  873. /* LUN not ready, medium removal prevented */
  874. const struct SCSISense sense_code_NOT_READY_REMOVAL_PREVENTED = {
  875. .key = NOT_READY, .asc = 0x53, .ascq = 0x00
  876. };
  877. /* Hardware error, internal target failure */
  878. const struct SCSISense sense_code_TARGET_FAILURE = {
  879. .key = HARDWARE_ERROR, .asc = 0x44, .ascq = 0x00
  880. };
  881. /* Illegal request, invalid command operation code */
  882. const struct SCSISense sense_code_INVALID_OPCODE = {
  883. .key = ILLEGAL_REQUEST, .asc = 0x20, .ascq = 0x00
  884. };
  885. /* Illegal request, LBA out of range */
  886. const struct SCSISense sense_code_LBA_OUT_OF_RANGE = {
  887. .key = ILLEGAL_REQUEST, .asc = 0x21, .ascq = 0x00
  888. };
  889. /* Illegal request, Invalid field in CDB */
  890. const struct SCSISense sense_code_INVALID_FIELD = {
  891. .key = ILLEGAL_REQUEST, .asc = 0x24, .ascq = 0x00
  892. };
  893. /* Illegal request, LUN not supported */
  894. const struct SCSISense sense_code_LUN_NOT_SUPPORTED = {
  895. .key = ILLEGAL_REQUEST, .asc = 0x25, .ascq = 0x00
  896. };
  897. /* Illegal request, Saving parameters not supported */
  898. const struct SCSISense sense_code_SAVING_PARAMS_NOT_SUPPORTED = {
  899. .key = ILLEGAL_REQUEST, .asc = 0x39, .ascq = 0x00
  900. };
  901. /* Illegal request, Incompatible medium installed */
  902. const struct SCSISense sense_code_INCOMPATIBLE_FORMAT = {
  903. .key = ILLEGAL_REQUEST, .asc = 0x30, .ascq = 0x00
  904. };
  905. /* Illegal request, medium removal prevented */
  906. const struct SCSISense sense_code_ILLEGAL_REQ_REMOVAL_PREVENTED = {
  907. .key = ILLEGAL_REQUEST, .asc = 0x53, .ascq = 0x00
  908. };
  909. /* Command aborted, I/O process terminated */
  910. const struct SCSISense sense_code_IO_ERROR = {
  911. .key = ABORTED_COMMAND, .asc = 0x00, .ascq = 0x06
  912. };
  913. /* Command aborted, I_T Nexus loss occurred */
  914. const struct SCSISense sense_code_I_T_NEXUS_LOSS = {
  915. .key = ABORTED_COMMAND, .asc = 0x29, .ascq = 0x07
  916. };
  917. /* Command aborted, Logical Unit failure */
  918. const struct SCSISense sense_code_LUN_FAILURE = {
  919. .key = ABORTED_COMMAND, .asc = 0x3e, .ascq = 0x01
  920. };
  921. /* Unit attention, Power on, reset or bus device reset occurred */
  922. const struct SCSISense sense_code_RESET = {
  923. .key = UNIT_ATTENTION, .asc = 0x29, .ascq = 0x00
  924. };
  925. /* Unit attention, No medium */
  926. const struct SCSISense sense_code_UNIT_ATTENTION_NO_MEDIUM = {
  927. .key = UNIT_ATTENTION, .asc = 0x3a, .ascq = 0x00
  928. };
  929. /* Unit attention, Medium may have changed */
  930. const struct SCSISense sense_code_MEDIUM_CHANGED = {
  931. .key = UNIT_ATTENTION, .asc = 0x28, .ascq = 0x00
  932. };
  933. /* Unit attention, Reported LUNs data has changed */
  934. const struct SCSISense sense_code_REPORTED_LUNS_CHANGED = {
  935. .key = UNIT_ATTENTION, .asc = 0x3f, .ascq = 0x0e
  936. };
  937. /* Unit attention, Device internal reset */
  938. const struct SCSISense sense_code_DEVICE_INTERNAL_RESET = {
  939. .key = UNIT_ATTENTION, .asc = 0x29, .ascq = 0x04
  940. };
  941. /*
  942. * scsi_build_sense
  943. *
  944. * Convert between fixed and descriptor sense buffers
  945. */
  946. int scsi_build_sense(uint8_t *in_buf, int in_len,
  947. uint8_t *buf, int len, bool fixed)
  948. {
  949. bool fixed_in;
  950. SCSISense sense;
  951. if (!fixed && len < 8) {
  952. return 0;
  953. }
  954. if (in_len == 0) {
  955. sense.key = NO_SENSE;
  956. sense.asc = 0;
  957. sense.ascq = 0;
  958. } else {
  959. fixed_in = (in_buf[0] & 2) == 0;
  960. if (fixed == fixed_in) {
  961. memcpy(buf, in_buf, MIN(len, in_len));
  962. return MIN(len, in_len);
  963. }
  964. if (fixed_in) {
  965. sense.key = in_buf[2];
  966. sense.asc = in_buf[12];
  967. sense.ascq = in_buf[13];
  968. } else {
  969. sense.key = in_buf[1];
  970. sense.asc = in_buf[2];
  971. sense.ascq = in_buf[3];
  972. }
  973. }
  974. memset(buf, 0, len);
  975. if (fixed) {
  976. /* Return fixed format sense buffer */
  977. buf[0] = 0xf0;
  978. buf[2] = sense.key;
  979. buf[7] = 10;
  980. buf[12] = sense.asc;
  981. buf[13] = sense.ascq;
  982. return MIN(len, 18);
  983. } else {
  984. /* Return descriptor format sense buffer */
  985. buf[0] = 0x72;
  986. buf[1] = sense.key;
  987. buf[2] = sense.asc;
  988. buf[3] = sense.ascq;
  989. return 8;
  990. }
  991. }
  992. static const char *scsi_command_name(uint8_t cmd)
  993. {
  994. static const char *names[] = {
  995. [ TEST_UNIT_READY ] = "TEST_UNIT_READY",
  996. [ REWIND ] = "REWIND",
  997. [ REQUEST_SENSE ] = "REQUEST_SENSE",
  998. [ FORMAT_UNIT ] = "FORMAT_UNIT",
  999. [ READ_BLOCK_LIMITS ] = "READ_BLOCK_LIMITS",
  1000. [ REASSIGN_BLOCKS ] = "REASSIGN_BLOCKS",
  1001. [ READ_6 ] = "READ_6",
  1002. [ WRITE_6 ] = "WRITE_6",
  1003. [ SET_CAPACITY ] = "SET_CAPACITY",
  1004. [ READ_REVERSE ] = "READ_REVERSE",
  1005. [ WRITE_FILEMARKS ] = "WRITE_FILEMARKS",
  1006. [ SPACE ] = "SPACE",
  1007. [ INQUIRY ] = "INQUIRY",
  1008. [ RECOVER_BUFFERED_DATA ] = "RECOVER_BUFFERED_DATA",
  1009. [ MAINTENANCE_IN ] = "MAINTENANCE_IN",
  1010. [ MAINTENANCE_OUT ] = "MAINTENANCE_OUT",
  1011. [ MODE_SELECT ] = "MODE_SELECT",
  1012. [ RESERVE ] = "RESERVE",
  1013. [ RELEASE ] = "RELEASE",
  1014. [ COPY ] = "COPY",
  1015. [ ERASE ] = "ERASE",
  1016. [ MODE_SENSE ] = "MODE_SENSE",
  1017. [ START_STOP ] = "START_STOP",
  1018. [ RECEIVE_DIAGNOSTIC ] = "RECEIVE_DIAGNOSTIC",
  1019. [ SEND_DIAGNOSTIC ] = "SEND_DIAGNOSTIC",
  1020. [ ALLOW_MEDIUM_REMOVAL ] = "ALLOW_MEDIUM_REMOVAL",
  1021. [ READ_CAPACITY_10 ] = "READ_CAPACITY_10",
  1022. [ READ_10 ] = "READ_10",
  1023. [ WRITE_10 ] = "WRITE_10",
  1024. [ SEEK_10 ] = "SEEK_10",
  1025. [ WRITE_VERIFY_10 ] = "WRITE_VERIFY_10",
  1026. [ VERIFY_10 ] = "VERIFY_10",
  1027. [ SEARCH_HIGH ] = "SEARCH_HIGH",
  1028. [ SEARCH_EQUAL ] = "SEARCH_EQUAL",
  1029. [ SEARCH_LOW ] = "SEARCH_LOW",
  1030. [ SET_LIMITS ] = "SET_LIMITS",
  1031. [ PRE_FETCH ] = "PRE_FETCH/READ_POSITION",
  1032. /* READ_POSITION and PRE_FETCH use the same operation code */
  1033. [ SYNCHRONIZE_CACHE ] = "SYNCHRONIZE_CACHE",
  1034. [ LOCK_UNLOCK_CACHE ] = "LOCK_UNLOCK_CACHE",
  1035. [ READ_DEFECT_DATA ] = "READ_DEFECT_DATA",
  1036. [ MEDIUM_SCAN ] = "MEDIUM_SCAN",
  1037. [ COMPARE ] = "COMPARE",
  1038. [ COPY_VERIFY ] = "COPY_VERIFY",
  1039. [ WRITE_BUFFER ] = "WRITE_BUFFER",
  1040. [ READ_BUFFER ] = "READ_BUFFER",
  1041. [ UPDATE_BLOCK ] = "UPDATE_BLOCK",
  1042. [ READ_LONG_10 ] = "READ_LONG_10",
  1043. [ WRITE_LONG_10 ] = "WRITE_LONG_10",
  1044. [ CHANGE_DEFINITION ] = "CHANGE_DEFINITION",
  1045. [ WRITE_SAME_10 ] = "WRITE_SAME_10",
  1046. [ UNMAP ] = "UNMAP",
  1047. [ READ_TOC ] = "READ_TOC",
  1048. [ REPORT_DENSITY_SUPPORT ] = "REPORT_DENSITY_SUPPORT",
  1049. [ GET_CONFIGURATION ] = "GET_CONFIGURATION",
  1050. [ LOG_SELECT ] = "LOG_SELECT",
  1051. [ LOG_SENSE ] = "LOG_SENSE",
  1052. [ MODE_SELECT_10 ] = "MODE_SELECT_10",
  1053. [ RESERVE_10 ] = "RESERVE_10",
  1054. [ RELEASE_10 ] = "RELEASE_10",
  1055. [ MODE_SENSE_10 ] = "MODE_SENSE_10",
  1056. [ PERSISTENT_RESERVE_IN ] = "PERSISTENT_RESERVE_IN",
  1057. [ PERSISTENT_RESERVE_OUT ] = "PERSISTENT_RESERVE_OUT",
  1058. [ WRITE_FILEMARKS_16 ] = "WRITE_FILEMARKS_16",
  1059. [ EXTENDED_COPY ] = "EXTENDED_COPY",
  1060. [ ATA_PASSTHROUGH ] = "ATA_PASSTHROUGH",
  1061. [ ACCESS_CONTROL_IN ] = "ACCESS_CONTROL_IN",
  1062. [ ACCESS_CONTROL_OUT ] = "ACCESS_CONTROL_OUT",
  1063. [ READ_16 ] = "READ_16",
  1064. [ COMPARE_AND_WRITE ] = "COMPARE_AND_WRITE",
  1065. [ WRITE_16 ] = "WRITE_16",
  1066. [ WRITE_VERIFY_16 ] = "WRITE_VERIFY_16",
  1067. [ VERIFY_16 ] = "VERIFY_16",
  1068. [ PRE_FETCH_16 ] = "PRE_FETCH_16",
  1069. [ SYNCHRONIZE_CACHE_16 ] = "SPACE_16/SYNCHRONIZE_CACHE_16",
  1070. /* SPACE_16 and SYNCHRONIZE_CACHE_16 use the same operation code */
  1071. [ LOCATE_16 ] = "LOCATE_16",
  1072. [ WRITE_SAME_16 ] = "ERASE_16/WRITE_SAME_16",
  1073. /* ERASE_16 and WRITE_SAME_16 use the same operation code */
  1074. [ SERVICE_ACTION_IN_16 ] = "SERVICE_ACTION_IN_16",
  1075. [ WRITE_LONG_16 ] = "WRITE_LONG_16",
  1076. [ REPORT_LUNS ] = "REPORT_LUNS",
  1077. [ BLANK ] = "BLANK",
  1078. [ MOVE_MEDIUM ] = "MOVE_MEDIUM",
  1079. [ LOAD_UNLOAD ] = "LOAD_UNLOAD",
  1080. [ READ_12 ] = "READ_12",
  1081. [ WRITE_12 ] = "WRITE_12",
  1082. [ ERASE_12 ] = "ERASE_12/GET_PERFORMANCE",
  1083. /* ERASE_12 and GET_PERFORMANCE use the same operation code */
  1084. [ SERVICE_ACTION_IN_12 ] = "SERVICE_ACTION_IN_12",
  1085. [ WRITE_VERIFY_12 ] = "WRITE_VERIFY_12",
  1086. [ VERIFY_12 ] = "VERIFY_12",
  1087. [ SEARCH_HIGH_12 ] = "SEARCH_HIGH_12",
  1088. [ SEARCH_EQUAL_12 ] = "SEARCH_EQUAL_12",
  1089. [ SEARCH_LOW_12 ] = "SEARCH_LOW_12",
  1090. [ READ_ELEMENT_STATUS ] = "READ_ELEMENT_STATUS",
  1091. [ SEND_VOLUME_TAG ] = "SEND_VOLUME_TAG/SET_STREAMING",
  1092. /* SEND_VOLUME_TAG and SET_STREAMING use the same operation code */
  1093. [ READ_CD ] = "READ_CD",
  1094. [ READ_DEFECT_DATA_12 ] = "READ_DEFECT_DATA_12",
  1095. [ READ_DVD_STRUCTURE ] = "READ_DVD_STRUCTURE",
  1096. [ RESERVE_TRACK ] = "RESERVE_TRACK",
  1097. [ SEND_CUE_SHEET ] = "SEND_CUE_SHEET",
  1098. [ SEND_DVD_STRUCTURE ] = "SEND_DVD_STRUCTURE",
  1099. [ SET_CD_SPEED ] = "SET_CD_SPEED",
  1100. [ SET_READ_AHEAD ] = "SET_READ_AHEAD",
  1101. [ ALLOW_OVERWRITE ] = "ALLOW_OVERWRITE",
  1102. [ MECHANISM_STATUS ] = "MECHANISM_STATUS",
  1103. };
  1104. if (cmd >= ARRAY_SIZE(names) || names[cmd] == NULL)
  1105. return "*UNKNOWN*";
  1106. return names[cmd];
  1107. }
  1108. SCSIRequest *scsi_req_ref(SCSIRequest *req)
  1109. {
  1110. req->refcount++;
  1111. return req;
  1112. }
  1113. void scsi_req_unref(SCSIRequest *req)
  1114. {
  1115. if (--req->refcount == 0) {
  1116. if (req->ops->free_req) {
  1117. req->ops->free_req(req);
  1118. }
  1119. g_free(req);
  1120. }
  1121. }
  1122. /* Tell the device that we finished processing this chunk of I/O. It
  1123. will start the next chunk or complete the command. */
  1124. void scsi_req_continue(SCSIRequest *req)
  1125. {
  1126. trace_scsi_req_continue(req->dev->id, req->lun, req->tag);
  1127. if (req->cmd.mode == SCSI_XFER_TO_DEV) {
  1128. req->ops->write_data(req);
  1129. } else {
  1130. req->ops->read_data(req);
  1131. }
  1132. }
  1133. /* Called by the devices when data is ready for the HBA. The HBA should
  1134. start a DMA operation to read or fill the device's data buffer.
  1135. Once it completes, calling scsi_req_continue will restart I/O. */
  1136. void scsi_req_data(SCSIRequest *req, int len)
  1137. {
  1138. if (req->io_canceled) {
  1139. trace_scsi_req_data_canceled(req->dev->id, req->lun, req->tag, len);
  1140. } else {
  1141. trace_scsi_req_data(req->dev->id, req->lun, req->tag, len);
  1142. req->bus->info->transfer_data(req, len);
  1143. }
  1144. }
  1145. void scsi_req_print(SCSIRequest *req)
  1146. {
  1147. FILE *fp = stderr;
  1148. int i;
  1149. fprintf(fp, "[%s id=%d] %s",
  1150. req->dev->qdev.parent_bus->name,
  1151. req->dev->id,
  1152. scsi_command_name(req->cmd.buf[0]));
  1153. for (i = 1; i < req->cmd.len; i++) {
  1154. fprintf(fp, " 0x%02x", req->cmd.buf[i]);
  1155. }
  1156. switch (req->cmd.mode) {
  1157. case SCSI_XFER_NONE:
  1158. fprintf(fp, " - none\n");
  1159. break;
  1160. case SCSI_XFER_FROM_DEV:
  1161. fprintf(fp, " - from-dev len=%zd\n", req->cmd.xfer);
  1162. break;
  1163. case SCSI_XFER_TO_DEV:
  1164. fprintf(fp, " - to-dev len=%zd\n", req->cmd.xfer);
  1165. break;
  1166. default:
  1167. fprintf(fp, " - Oops\n");
  1168. break;
  1169. }
  1170. }
  1171. void scsi_req_complete(SCSIRequest *req, int status)
  1172. {
  1173. assert(req->status == -1);
  1174. req->status = status;
  1175. assert(req->sense_len < sizeof(req->sense));
  1176. if (status == GOOD) {
  1177. req->sense_len = 0;
  1178. }
  1179. if (req->sense_len) {
  1180. memcpy(req->dev->sense, req->sense, req->sense_len);
  1181. req->dev->sense_len = req->sense_len;
  1182. req->dev->sense_is_ua = (req->ops == &reqops_unit_attention);
  1183. } else {
  1184. req->dev->sense_len = 0;
  1185. req->dev->sense_is_ua = false;
  1186. }
  1187. /*
  1188. * Unit attention state is now stored in the device's sense buffer
  1189. * if the HBA didn't do autosense. Clear the pending unit attention
  1190. * flags.
  1191. */
  1192. scsi_clear_unit_attention(req);
  1193. scsi_req_ref(req);
  1194. scsi_req_dequeue(req);
  1195. req->bus->info->complete(req, req->status);
  1196. scsi_req_unref(req);
  1197. }
  1198. void scsi_req_cancel(SCSIRequest *req)
  1199. {
  1200. if (!req->enqueued) {
  1201. return;
  1202. }
  1203. scsi_req_ref(req);
  1204. scsi_req_dequeue(req);
  1205. req->io_canceled = true;
  1206. if (req->ops->cancel_io) {
  1207. req->ops->cancel_io(req);
  1208. }
  1209. if (req->bus->info->cancel) {
  1210. req->bus->info->cancel(req);
  1211. }
  1212. scsi_req_unref(req);
  1213. }
  1214. void scsi_req_abort(SCSIRequest *req, int status)
  1215. {
  1216. if (!req->enqueued) {
  1217. return;
  1218. }
  1219. scsi_req_ref(req);
  1220. scsi_req_dequeue(req);
  1221. req->io_canceled = true;
  1222. if (req->ops->cancel_io) {
  1223. req->ops->cancel_io(req);
  1224. }
  1225. scsi_req_complete(req, status);
  1226. scsi_req_unref(req);
  1227. }
  1228. void scsi_device_purge_requests(SCSIDevice *sdev, SCSISense sense)
  1229. {
  1230. SCSIRequest *req;
  1231. while (!QTAILQ_EMPTY(&sdev->requests)) {
  1232. req = QTAILQ_FIRST(&sdev->requests);
  1233. scsi_req_cancel(req);
  1234. }
  1235. sdev->unit_attention = sense;
  1236. }
  1237. static char *scsibus_get_fw_dev_path(DeviceState *dev)
  1238. {
  1239. SCSIDevice *d = DO_UPCAST(SCSIDevice, qdev, dev);
  1240. char path[100];
  1241. snprintf(path, sizeof(path), "channel@%x/%s@%x,%x", d->channel,
  1242. qdev_fw_name(dev), d->id, d->lun);
  1243. return strdup(path);
  1244. }
  1245. SCSIDevice *scsi_device_find(SCSIBus *bus, int channel, int id, int lun)
  1246. {
  1247. DeviceState *qdev;
  1248. SCSIDevice *target_dev = NULL;
  1249. QTAILQ_FOREACH_REVERSE(qdev, &bus->qbus.children, ChildrenHead, sibling) {
  1250. SCSIDevice *dev = DO_UPCAST(SCSIDevice, qdev, qdev);
  1251. if (dev->channel == channel && dev->id == id) {
  1252. if (dev->lun == lun) {
  1253. return dev;
  1254. }
  1255. target_dev = dev;
  1256. }
  1257. }
  1258. return target_dev;
  1259. }