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