Statistics
| Branch: | Revision:

root / hw / scsi-bus.c @ f5654039

History | View | Annotate | Download (39.5 kB)

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 void scsi_req_dequeue(SCSIRequest *req);
12

    
13
static struct BusInfo scsi_bus_info = {
14
    .name  = "SCSI",
15
    .size  = sizeof(SCSIBus),
16
    .get_fw_dev_path = scsibus_get_fw_dev_path,
17
    .props = (Property[]) {
18
        DEFINE_PROP_UINT32("channel", SCSIDevice, channel, 0),
19
        DEFINE_PROP_UINT32("scsi-id", SCSIDevice, id, -1),
20
        DEFINE_PROP_UINT32("lun", SCSIDevice, lun, -1),
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, const SCSIBusInfo *info)
28
{
29
    qbus_create_inplace(&bus->qbus, &scsi_bus_info, host, NULL);
30
    bus->busnr = next_scsi_bus++;
31
    bus->info = info;
32
    bus->qbus.allow_hotplug = 1;
33
}
34

    
35
static void scsi_dma_restart_bh(void *opaque)
36
{
37
    SCSIDevice *s = opaque;
38
    SCSIRequest *req, *next;
39

    
40
    qemu_bh_delete(s->bh);
41
    s->bh = NULL;
42

    
43
    QTAILQ_FOREACH_SAFE(req, &s->requests, next, next) {
44
        scsi_req_ref(req);
45
        if (req->retry) {
46
            req->retry = false;
47
            switch (req->cmd.mode) {
48
            case SCSI_XFER_FROM_DEV:
49
            case SCSI_XFER_TO_DEV:
50
                scsi_req_continue(req);
51
                break;
52
            case SCSI_XFER_NONE:
53
                scsi_req_dequeue(req);
54
                scsi_req_enqueue(req);
55
                break;
56
            }
57
        }
58
        scsi_req_unref(req);
59
    }
60
}
61

    
62
void scsi_req_retry(SCSIRequest *req)
63
{
64
    /* No need to save a reference, because scsi_dma_restart_bh just
65
     * looks at the request list.  */
66
    req->retry = true;
67
}
68

    
69
static void scsi_dma_restart_cb(void *opaque, int running, RunState state)
70
{
71
    SCSIDevice *s = opaque;
72

    
73
    if (!running) {
74
        return;
75
    }
76
    if (!s->bh) {
77
        s->bh = qemu_bh_new(scsi_dma_restart_bh, s);
78
        qemu_bh_schedule(s->bh);
79
    }
80
}
81

    
82
static int scsi_qdev_init(DeviceState *qdev, DeviceInfo *base)
83
{
84
    SCSIDevice *dev = DO_UPCAST(SCSIDevice, qdev, qdev);
85
    SCSIDeviceInfo *info = DO_UPCAST(SCSIDeviceInfo, qdev, base);
86
    SCSIBus *bus = DO_UPCAST(SCSIBus, qbus, dev->qdev.parent_bus);
87
    SCSIDevice *d;
88
    int rc = -1;
89

    
90
    if (dev->channel > bus->info->max_channel) {
91
        error_report("bad scsi channel id: %d", dev->channel);
92
        goto err;
93
    }
94
    if (dev->id != -1 && dev->id > bus->info->max_target) {
95
        error_report("bad scsi device id: %d", dev->id);
96
        goto err;
97
    }
98

    
99
    if (dev->id == -1) {
100
        int id = -1;
101
        if (dev->lun == -1) {
102
            dev->lun = 0;
103
        }
104
        do {
105
            d = scsi_device_find(bus, dev->channel, ++id, dev->lun);
106
        } while (d && d->lun == dev->lun && id <= bus->info->max_target);
107
        if (id > bus->info->max_target) {
108
            error_report("no free target");
109
            goto err;
110
        }
111
        dev->id = id;
112
    } else if (dev->lun == -1) {
113
        int lun = -1;
114
        do {
115
            d = scsi_device_find(bus, dev->channel, dev->id, ++lun);
116
        } while (d && d->lun == lun && lun < bus->info->max_lun);
117
        if (lun > bus->info->max_lun) {
118
            error_report("no free lun");
119
            goto err;
120
        }
121
        dev->lun = lun;
122
    } else {
123
        d = scsi_device_find(bus, dev->channel, dev->id, dev->lun);
124
        if (dev->lun == d->lun && dev != d) {
125
            qdev_free(&d->qdev);
126
        }
127
    }
128

    
129
    dev->info = info;
130
    QTAILQ_INIT(&dev->requests);
131
    rc = dev->info->init(dev);
132
    if (rc == 0) {
133
        dev->vmsentry = qemu_add_vm_change_state_handler(scsi_dma_restart_cb,
134
                                                         dev);
135
    }
136

    
137
err:
138
    return rc;
139
}
140

    
141
static int scsi_qdev_exit(DeviceState *qdev)
142
{
143
    SCSIDevice *dev = DO_UPCAST(SCSIDevice, qdev, qdev);
144

    
145
    if (dev->vmsentry) {
146
        qemu_del_vm_change_state_handler(dev->vmsentry);
147
    }
148
    if (dev->info->destroy) {
149
        dev->info->destroy(dev);
150
    }
151
    return 0;
152
}
153

    
154
void scsi_qdev_register(SCSIDeviceInfo *info)
155
{
156
    info->qdev.bus_info = &scsi_bus_info;
157
    info->qdev.init     = scsi_qdev_init;
158
    info->qdev.unplug   = qdev_simple_unplug_cb;
159
    info->qdev.exit     = scsi_qdev_exit;
160
    qdev_register(&info->qdev);
161
}
162

    
163
/* handle legacy '-drive if=scsi,...' cmd line args */
164
SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockDriverState *bdrv,
165
                                      int unit, bool removable)
166
{
167
    const char *driver;
168
    DeviceState *dev;
169

    
170
    driver = bdrv_is_sg(bdrv) ? "scsi-generic" : "scsi-disk";
171
    dev = qdev_create(&bus->qbus, driver);
172
    qdev_prop_set_uint32(dev, "scsi-id", unit);
173
    if (qdev_prop_exists(dev, "removable")) {
174
        qdev_prop_set_bit(dev, "removable", removable);
175
    }
176
    if (qdev_prop_set_drive(dev, "drive", bdrv) < 0) {
177
        qdev_free(dev);
178
        return NULL;
179
    }
180
    if (qdev_init(dev) < 0)
181
        return NULL;
182
    return DO_UPCAST(SCSIDevice, qdev, dev);
183
}
184

    
185
int scsi_bus_legacy_handle_cmdline(SCSIBus *bus)
186
{
187
    Location loc;
188
    DriveInfo *dinfo;
189
    int res = 0, unit;
190

    
191
    loc_push_none(&loc);
192
    for (unit = 0; unit < bus->info->max_target; unit++) {
193
        dinfo = drive_get(IF_SCSI, bus->busnr, unit);
194
        if (dinfo == NULL) {
195
            continue;
196
        }
197
        qemu_opts_loc_restore(dinfo->opts);
198
        if (!scsi_bus_legacy_add_drive(bus, dinfo->bdrv, unit, false)) {
199
            res = -1;
200
            break;
201
        }
202
    }
203
    loc_pop(&loc);
204
    return res;
205
}
206

    
207
/* SCSIReqOps implementation for invalid commands.  */
208

    
209
static int32_t scsi_invalid_command(SCSIRequest *req, uint8_t *buf)
210
{
211
    scsi_req_build_sense(req, SENSE_CODE(INVALID_OPCODE));
212
    scsi_req_complete(req, CHECK_CONDITION);
213
    return 0;
214
}
215

    
216
static const struct SCSIReqOps reqops_invalid_opcode = {
217
    .size         = sizeof(SCSIRequest),
218
    .send_command = scsi_invalid_command
219
};
220

    
221
/* SCSIReqOps implementation for unit attention conditions.  */
222

    
223
static int32_t scsi_unit_attention(SCSIRequest *req, uint8_t *buf)
224
{
225
    if (req->dev && req->dev->unit_attention.key == UNIT_ATTENTION) {
226
        scsi_req_build_sense(req, req->dev->unit_attention);
227
    } else if (req->bus->unit_attention.key == UNIT_ATTENTION) {
228
        scsi_req_build_sense(req, req->bus->unit_attention);
229
    }
230
    scsi_req_complete(req, CHECK_CONDITION);
231
    return 0;
232
}
233

    
234
static const struct SCSIReqOps reqops_unit_attention = {
235
    .size         = sizeof(SCSIRequest),
236
    .send_command = scsi_unit_attention
237
};
238

    
239
/* SCSIReqOps implementation for REPORT LUNS and for commands sent to
240
   an invalid LUN.  */
241

    
242
typedef struct SCSITargetReq SCSITargetReq;
243

    
244
struct SCSITargetReq {
245
    SCSIRequest req;
246
    int len;
247
    uint8_t buf[2056];
248
};
249

    
250
static void store_lun(uint8_t *outbuf, int lun)
251
{
252
    if (lun < 256) {
253
        outbuf[1] = lun;
254
        return;
255
    }
256
    outbuf[1] = (lun & 255);
257
    outbuf[0] = (lun >> 8) | 0x40;
258
}
259

    
260
static bool scsi_target_emulate_report_luns(SCSITargetReq *r)
261
{
262
    DeviceState *qdev;
263
    int i, len, n;
264
    int channel, id;
265
    bool found_lun0;
266

    
267
    if (r->req.cmd.xfer < 16) {
268
        return false;
269
    }
270
    if (r->req.cmd.buf[2] > 2) {
271
        return false;
272
    }
273
    channel = r->req.dev->channel;
274
    id = r->req.dev->id;
275
    found_lun0 = false;
276
    n = 0;
277
    QTAILQ_FOREACH(qdev, &r->req.bus->qbus.children, sibling) {
278
        SCSIDevice *dev = DO_UPCAST(SCSIDevice, qdev, qdev);
279

    
280
        if (dev->channel == channel && dev->id == id) {
281
            if (dev->lun == 0) {
282
                found_lun0 = true;
283
            }
284
            n += 8;
285
        }
286
    }
287
    if (!found_lun0) {
288
        n += 8;
289
    }
290
    len = MIN(n + 8, r->req.cmd.xfer & ~7);
291
    if (len > sizeof(r->buf)) {
292
        /* TODO: > 256 LUNs? */
293
        return false;
294
    }
295

    
296
    memset(r->buf, 0, len);
297
    stl_be_p(&r->buf, n);
298
    i = found_lun0 ? 8 : 16;
299
    QTAILQ_FOREACH(qdev, &r->req.bus->qbus.children, sibling) {
300
        SCSIDevice *dev = DO_UPCAST(SCSIDevice, qdev, qdev);
301

    
302
        if (dev->channel == channel && dev->id == id) {
303
            store_lun(&r->buf[i], dev->lun);
304
            i += 8;
305
        }
306
    }
307
    assert(i == n + 8);
308
    r->len = len;
309
    return true;
310
}
311

    
312
static bool scsi_target_emulate_inquiry(SCSITargetReq *r)
313
{
314
    assert(r->req.dev->lun != r->req.lun);
315
    if (r->req.cmd.buf[1] & 0x2) {
316
        /* Command support data - optional, not implemented */
317
        return false;
318
    }
319

    
320
    if (r->req.cmd.buf[1] & 0x1) {
321
        /* Vital product data */
322
        uint8_t page_code = r->req.cmd.buf[2];
323
        if (r->req.cmd.xfer < 4) {
324
            return false;
325
        }
326

    
327
        r->buf[r->len++] = page_code ; /* this page */
328
        r->buf[r->len++] = 0x00;
329

    
330
        switch (page_code) {
331
        case 0x00: /* Supported page codes, mandatory */
332
        {
333
            int pages;
334
            pages = r->len++;
335
            r->buf[r->len++] = 0x00; /* list of supported pages (this page) */
336
            r->buf[pages] = r->len - pages - 1; /* number of pages */
337
            break;
338
        }
339
        default:
340
            return false;
341
        }
342
        /* done with EVPD */
343
        assert(r->len < sizeof(r->buf));
344
        r->len = MIN(r->req.cmd.xfer, r->len);
345
        return true;
346
    }
347

    
348
    /* Standard INQUIRY data */
349
    if (r->req.cmd.buf[2] != 0) {
350
        return false;
351
    }
352

    
353
    /* PAGE CODE == 0 */
354
    if (r->req.cmd.xfer < 5) {
355
        return -1;
356
    }
357

    
358
    r->len = MIN(r->req.cmd.xfer, 36);
359
    memset(r->buf, 0, r->len);
360
    if (r->req.lun != 0) {
361
        r->buf[0] = TYPE_NO_LUN;
362
    } else {
363
        r->buf[0] = TYPE_NOT_PRESENT | TYPE_INACTIVE;
364
        r->buf[2] = 5; /* Version */
365
        r->buf[3] = 2 | 0x10; /* HiSup, response data format */
366
        r->buf[4] = r->len - 5; /* Additional Length = (Len - 1) - 4 */
367
        r->buf[7] = 0x10 | (r->req.bus->info->tcq ? 0x02 : 0); /* Sync, TCQ.  */
368
        memcpy(&r->buf[8], "QEMU    ", 8);
369
        memcpy(&r->buf[16], "QEMU TARGET     ", 16);
370
        strncpy((char *) &r->buf[32], QEMU_VERSION, 4);
371
    }
372
    return true;
373
}
374

    
375
static int32_t scsi_target_send_command(SCSIRequest *req, uint8_t *buf)
376
{
377
    SCSITargetReq *r = DO_UPCAST(SCSITargetReq, req, req);
378

    
379
    switch (buf[0]) {
380
    case REPORT_LUNS:
381
        if (!scsi_target_emulate_report_luns(r)) {
382
            goto illegal_request;
383
        }
384
        break;
385
    case INQUIRY:
386
        if (!scsi_target_emulate_inquiry(r)) {
387
            goto illegal_request;
388
        }
389
        break;
390
    case REQUEST_SENSE:
391
        if (req->cmd.xfer < 4) {
392
            goto illegal_request;
393
        }
394
        r->len = scsi_device_get_sense(r->req.dev, r->buf,
395
                                       MIN(req->cmd.xfer, sizeof r->buf),
396
                                       (req->cmd.buf[1] & 1) == 0);
397
        if (r->req.dev->sense_is_ua) {
398
            if (r->req.dev->info->unit_attention_reported) {
399
                r->req.dev->info->unit_attention_reported(req->dev);
400
            }
401
            r->req.dev->sense_len = 0;
402
            r->req.dev->sense_is_ua = false;
403
        }
404
        break;
405
    default:
406
        scsi_req_build_sense(req, SENSE_CODE(LUN_NOT_SUPPORTED));
407
        scsi_req_complete(req, CHECK_CONDITION);
408
        return 0;
409
    illegal_request:
410
        scsi_req_build_sense(req, SENSE_CODE(INVALID_FIELD));
411
        scsi_req_complete(req, CHECK_CONDITION);
412
        return 0;
413
    }
414

    
415
    if (!r->len) {
416
        scsi_req_complete(req, GOOD);
417
    }
418
    return r->len;
419
}
420

    
421
static void scsi_target_read_data(SCSIRequest *req)
422
{
423
    SCSITargetReq *r = DO_UPCAST(SCSITargetReq, req, req);
424
    uint32_t n;
425

    
426
    n = r->len;
427
    if (n > 0) {
428
        r->len = 0;
429
        scsi_req_data(&r->req, n);
430
    } else {
431
        scsi_req_complete(&r->req, GOOD);
432
    }
433
}
434

    
435
static uint8_t *scsi_target_get_buf(SCSIRequest *req)
436
{
437
    SCSITargetReq *r = DO_UPCAST(SCSITargetReq, req, req);
438

    
439
    return r->buf;
440
}
441

    
442
static const struct SCSIReqOps reqops_target_command = {
443
    .size         = sizeof(SCSITargetReq),
444
    .send_command = scsi_target_send_command,
445
    .read_data    = scsi_target_read_data,
446
    .get_buf      = scsi_target_get_buf,
447
};
448

    
449

    
450
SCSIRequest *scsi_req_alloc(const SCSIReqOps *reqops, SCSIDevice *d,
451
                            uint32_t tag, uint32_t lun, void *hba_private)
452
{
453
    SCSIRequest *req;
454

    
455
    req = g_malloc0(reqops->size);
456
    req->refcount = 1;
457
    req->bus = scsi_bus_from_device(d);
458
    req->dev = d;
459
    req->tag = tag;
460
    req->lun = lun;
461
    req->hba_private = hba_private;
462
    req->status = -1;
463
    req->sense_len = 0;
464
    req->ops = reqops;
465
    trace_scsi_req_alloc(req->dev->id, req->lun, req->tag);
466
    return req;
467
}
468

    
469
SCSIRequest *scsi_req_new(SCSIDevice *d, uint32_t tag, uint32_t lun,
470
                          uint8_t *buf, void *hba_private)
471
{
472
    SCSIBus *bus = DO_UPCAST(SCSIBus, qbus, d->qdev.parent_bus);
473
    SCSIRequest *req;
474
    SCSICommand cmd;
475

    
476
    if (scsi_req_parse(&cmd, d, buf) != 0) {
477
        trace_scsi_req_parse_bad(d->id, lun, tag, buf[0]);
478
        req = scsi_req_alloc(&reqops_invalid_opcode, d, tag, lun, hba_private);
479
    } else {
480
        trace_scsi_req_parsed(d->id, lun, tag, buf[0],
481
                              cmd.mode, cmd.xfer);
482
        if (cmd.lba != -1) {
483
            trace_scsi_req_parsed_lba(d->id, lun, tag, buf[0],
484
                                      cmd.lba);
485
        }
486

    
487
        if ((d->unit_attention.key == UNIT_ATTENTION ||
488
             bus->unit_attention.key == UNIT_ATTENTION) &&
489
            (buf[0] != INQUIRY &&
490
             buf[0] != REPORT_LUNS &&
491
             buf[0] != GET_CONFIGURATION &&
492
             buf[0] != GET_EVENT_STATUS_NOTIFICATION &&
493

    
494
             /*
495
              * If we already have a pending unit attention condition,
496
              * report this one before triggering another one.
497
              */
498
             !(buf[0] == REQUEST_SENSE && d->sense_is_ua))) {
499
            req = scsi_req_alloc(&reqops_unit_attention, d, tag, lun,
500
                                 hba_private);
501
        } else if (lun != d->lun ||
502
            buf[0] == REPORT_LUNS ||
503
            (buf[0] == REQUEST_SENSE && (d->sense_len || cmd.xfer < 4))) {
504
            req = scsi_req_alloc(&reqops_target_command, d, tag, lun,
505
                                 hba_private);
506
        } else {
507
            req = d->info->alloc_req(d, tag, lun, buf, hba_private);
508
        }
509
    }
510

    
511
    req->cmd = cmd;
512
    switch (buf[0]) {
513
    case INQUIRY:
514
        trace_scsi_inquiry(d->id, lun, tag, cmd.buf[1], cmd.buf[2]);
515
        break;
516
    case TEST_UNIT_READY:
517
        trace_scsi_test_unit_ready(d->id, lun, tag);
518
        break;
519
    case REPORT_LUNS:
520
        trace_scsi_report_luns(d->id, lun, tag);
521
        break;
522
    case REQUEST_SENSE:
523
        trace_scsi_request_sense(d->id, lun, tag);
524
        break;
525
    default:
526
        break;
527
    }
528

    
529
    return req;
530
}
531

    
532
uint8_t *scsi_req_get_buf(SCSIRequest *req)
533
{
534
    return req->ops->get_buf(req);
535
}
536

    
537
static void scsi_clear_unit_attention(SCSIRequest *req)
538
{
539
    SCSISense *ua;
540
    if (req->dev->unit_attention.key != UNIT_ATTENTION &&
541
        req->bus->unit_attention.key != UNIT_ATTENTION) {
542
        return;
543
    }
544

    
545
    /*
546
     * If an INQUIRY command enters the enabled command state,
547
     * the device server shall [not] clear any unit attention condition;
548
     * See also MMC-6, paragraphs 6.5 and 6.6.2.
549
     */
550
    if (req->cmd.buf[0] == INQUIRY ||
551
        req->cmd.buf[0] == GET_CONFIGURATION ||
552
        req->cmd.buf[0] == GET_EVENT_STATUS_NOTIFICATION) {
553
        return;
554
    }
555

    
556
    if (req->dev->unit_attention.key == UNIT_ATTENTION) {
557
        ua = &req->dev->unit_attention;
558
    } else {
559
        ua = &req->bus->unit_attention;
560
    }
561

    
562
    /*
563
     * If a REPORT LUNS command enters the enabled command state, [...]
564
     * the device server shall clear any pending unit attention condition
565
     * with an additional sense code of REPORTED LUNS DATA HAS CHANGED.
566
     */
567
    if (req->cmd.buf[0] == REPORT_LUNS &&
568
        !(ua->asc == SENSE_CODE(REPORTED_LUNS_CHANGED).asc &&
569
          ua->ascq == SENSE_CODE(REPORTED_LUNS_CHANGED).ascq)) {
570
        return;
571
    }
572

    
573
    *ua = SENSE_CODE(NO_SENSE);
574
}
575

    
576
int scsi_req_get_sense(SCSIRequest *req, uint8_t *buf, int len)
577
{
578
    int ret;
579

    
580
    assert(len >= 14);
581
    if (!req->sense_len) {
582
        return 0;
583
    }
584

    
585
    ret = scsi_build_sense(req->sense, req->sense_len, buf, len, true);
586

    
587
    /*
588
     * FIXME: clearing unit attention conditions upon autosense should be done
589
     * only if the UA_INTLCK_CTRL field in the Control mode page is set to 00b
590
     * (SAM-5, 5.14).
591
     *
592
     * We assume UA_INTLCK_CTRL to be 00b for HBAs that support autosense, and
593
     * 10b for HBAs that do not support it (do not call scsi_req_get_sense).
594
     * Here we handle unit attention clearing for UA_INTLCK_CTRL == 00b.
595
     */
596
    if (req->dev->sense_is_ua) {
597
        if (req->dev->info->unit_attention_reported) {
598
            req->dev->info->unit_attention_reported(req->dev);
599
        }
600
        req->dev->sense_len = 0;
601
        req->dev->sense_is_ua = false;
602
    }
603
    return ret;
604
}
605

    
606
int scsi_device_get_sense(SCSIDevice *dev, uint8_t *buf, int len, bool fixed)
607
{
608
    return scsi_build_sense(dev->sense, dev->sense_len, buf, len, fixed);
609
}
610

    
611
void scsi_req_build_sense(SCSIRequest *req, SCSISense sense)
612
{
613
    trace_scsi_req_build_sense(req->dev->id, req->lun, req->tag,
614
                               sense.key, sense.asc, sense.ascq);
615
    memset(req->sense, 0, 18);
616
    req->sense[0] = 0xf0;
617
    req->sense[2] = sense.key;
618
    req->sense[7] = 10;
619
    req->sense[12] = sense.asc;
620
    req->sense[13] = sense.ascq;
621
    req->sense_len = 18;
622
}
623

    
624
int32_t scsi_req_enqueue(SCSIRequest *req)
625
{
626
    int32_t rc;
627

    
628
    assert(!req->enqueued);
629
    scsi_req_ref(req);
630
    req->enqueued = true;
631
    QTAILQ_INSERT_TAIL(&req->dev->requests, req, next);
632

    
633
    scsi_req_ref(req);
634
    rc = req->ops->send_command(req, req->cmd.buf);
635
    scsi_req_unref(req);
636
    return rc;
637
}
638

    
639
static void scsi_req_dequeue(SCSIRequest *req)
640
{
641
    trace_scsi_req_dequeue(req->dev->id, req->lun, req->tag);
642
    req->retry = false;
643
    if (req->enqueued) {
644
        QTAILQ_REMOVE(&req->dev->requests, req, next);
645
        req->enqueued = false;
646
        scsi_req_unref(req);
647
    }
648
}
649

    
650
static int scsi_get_performance_length(int num_desc, int type, int data_type)
651
{
652
    /* MMC-6, paragraph 6.7.  */
653
    switch (type) {
654
    case 0:
655
        if ((data_type & 3) == 0) {
656
            /* Each descriptor is as in Table 295 - Nominal performance.  */
657
            return 16 * num_desc + 8;
658
        } else {
659
            /* Each descriptor is as in Table 296 - Exceptions.  */
660
            return 6 * num_desc + 8;
661
        }
662
    case 1:
663
    case 4:
664
    case 5:
665
        return 8 * num_desc + 8;
666
    case 2:
667
        return 2048 * num_desc + 8;
668
    case 3:
669
        return 16 * num_desc + 8;
670
    default:
671
        return 8;
672
    }
673
}
674

    
675
static int scsi_req_length(SCSICommand *cmd, SCSIDevice *dev, uint8_t *buf)
676
{
677
    switch (buf[0] >> 5) {
678
    case 0:
679
        cmd->xfer = buf[4];
680
        cmd->len = 6;
681
        /* length 0 means 256 blocks */
682
        if (cmd->xfer == 0) {
683
            cmd->xfer = 256;
684
        }
685
        break;
686
    case 1:
687
    case 2:
688
        cmd->xfer = lduw_be_p(&buf[7]);
689
        cmd->len = 10;
690
        break;
691
    case 4:
692
        cmd->xfer = ldl_be_p(&buf[10]) & 0xffffffffULL;
693
        cmd->len = 16;
694
        break;
695
    case 5:
696
        cmd->xfer = ldl_be_p(&buf[6]) & 0xffffffffULL;
697
        cmd->len = 12;
698
        break;
699
    default:
700
        return -1;
701
    }
702

    
703
    switch (buf[0]) {
704
    case TEST_UNIT_READY:
705
    case REWIND:
706
    case START_STOP:
707
    case SET_CAPACITY:
708
    case WRITE_FILEMARKS:
709
    case WRITE_FILEMARKS_16:
710
    case SPACE:
711
    case RESERVE:
712
    case RELEASE:
713
    case ERASE:
714
    case ALLOW_MEDIUM_REMOVAL:
715
    case VERIFY_10:
716
    case SEEK_10:
717
    case SYNCHRONIZE_CACHE:
718
    case SYNCHRONIZE_CACHE_16:
719
    case LOCATE_16:
720
    case LOCK_UNLOCK_CACHE:
721
    case LOAD_UNLOAD:
722
    case SET_CD_SPEED:
723
    case SET_LIMITS:
724
    case WRITE_LONG_10:
725
    case MOVE_MEDIUM:
726
    case UPDATE_BLOCK:
727
    case RESERVE_TRACK:
728
    case SET_READ_AHEAD:
729
    case PRE_FETCH:
730
    case PRE_FETCH_16:
731
    case ALLOW_OVERWRITE:
732
        cmd->xfer = 0;
733
        break;
734
    case MODE_SENSE:
735
        break;
736
    case WRITE_SAME_10:
737
        cmd->xfer = 1;
738
        break;
739
    case READ_CAPACITY_10:
740
        cmd->xfer = 8;
741
        break;
742
    case READ_BLOCK_LIMITS:
743
        cmd->xfer = 6;
744
        break;
745
    case SEND_VOLUME_TAG:
746
        /* GPCMD_SET_STREAMING from multimedia commands.  */
747
        if (dev->type == TYPE_ROM) {
748
            cmd->xfer = buf[10] | (buf[9] << 8);
749
        } else {
750
            cmd->xfer = buf[9] | (buf[8] << 8);
751
        }
752
        break;
753
    case WRITE_10:
754
    case WRITE_VERIFY_10:
755
    case WRITE_6:
756
    case WRITE_12:
757
    case WRITE_VERIFY_12:
758
    case WRITE_16:
759
    case WRITE_VERIFY_16:
760
        cmd->xfer *= dev->blocksize;
761
        break;
762
    case READ_10:
763
    case READ_6:
764
    case READ_REVERSE:
765
    case RECOVER_BUFFERED_DATA:
766
    case READ_12:
767
    case READ_16:
768
        cmd->xfer *= dev->blocksize;
769
        break;
770
    case FORMAT_UNIT:
771
        /* MMC mandates the parameter list to be 12-bytes long.  Parameters
772
         * for block devices are restricted to the header right now.  */
773
        if (dev->type == TYPE_ROM && (buf[1] & 16)) {
774
            cmd->xfer = 12;
775
        } else {
776
            cmd->xfer = (buf[1] & 16) == 0 ? 0 : (buf[1] & 32 ? 8 : 4);
777
        }
778
        break;
779
    case INQUIRY:
780
    case RECEIVE_DIAGNOSTIC:
781
    case SEND_DIAGNOSTIC:
782
        cmd->xfer = buf[4] | (buf[3] << 8);
783
        break;
784
    case READ_CD:
785
    case READ_BUFFER:
786
    case WRITE_BUFFER:
787
    case SEND_CUE_SHEET:
788
        cmd->xfer = buf[8] | (buf[7] << 8) | (buf[6] << 16);
789
        break;
790
    case PERSISTENT_RESERVE_OUT:
791
        cmd->xfer = ldl_be_p(&buf[5]) & 0xffffffffULL;
792
        break;
793
    case ERASE_12:
794
        if (dev->type == TYPE_ROM) {
795
            /* MMC command GET PERFORMANCE.  */
796
            cmd->xfer = scsi_get_performance_length(buf[9] | (buf[8] << 8),
797
                                                    buf[10], buf[1] & 0x1f);
798
        }
799
        break;
800
    case MECHANISM_STATUS:
801
    case READ_DVD_STRUCTURE:
802
    case SEND_DVD_STRUCTURE:
803
    case MAINTENANCE_OUT:
804
    case MAINTENANCE_IN:
805
        if (dev->type == TYPE_ROM) {
806
            /* GPCMD_REPORT_KEY and GPCMD_SEND_KEY from multi media commands */
807
            cmd->xfer = buf[9] | (buf[8] << 8);
808
        }
809
        break;
810
    }
811
    return 0;
812
}
813

    
814
static int scsi_req_stream_length(SCSICommand *cmd, SCSIDevice *dev, uint8_t *buf)
815
{
816
    switch (buf[0]) {
817
    /* stream commands */
818
    case ERASE_12:
819
    case ERASE_16:
820
        cmd->xfer = 0;
821
        break;
822
    case READ_6:
823
    case READ_REVERSE:
824
    case RECOVER_BUFFERED_DATA:
825
    case WRITE_6:
826
        cmd->len = 6;
827
        cmd->xfer = buf[4] | (buf[3] << 8) | (buf[2] << 16);
828
        if (buf[1] & 0x01) { /* fixed */
829
            cmd->xfer *= dev->blocksize;
830
        }
831
        break;
832
    case REWIND:
833
    case START_STOP:
834
        cmd->len = 6;
835
        cmd->xfer = 0;
836
        break;
837
    case SPACE_16:
838
        cmd->xfer = buf[13] | (buf[12] << 8);
839
        break;
840
    case READ_POSITION:
841
        cmd->xfer = buf[8] | (buf[7] << 8);
842
        break;
843
    case FORMAT_UNIT:
844
        cmd->xfer = buf[4] | (buf[3] << 8);
845
        break;
846
    /* generic commands */
847
    default:
848
        return scsi_req_length(cmd, dev, buf);
849
    }
850
    return 0;
851
}
852

    
853
static void scsi_cmd_xfer_mode(SCSICommand *cmd)
854
{
855
    switch (cmd->buf[0]) {
856
    case WRITE_6:
857
    case WRITE_10:
858
    case WRITE_VERIFY_10:
859
    case WRITE_12:
860
    case WRITE_VERIFY_12:
861
    case WRITE_16:
862
    case WRITE_VERIFY_16:
863
    case COPY:
864
    case COPY_VERIFY:
865
    case COMPARE:
866
    case CHANGE_DEFINITION:
867
    case LOG_SELECT:
868
    case MODE_SELECT:
869
    case MODE_SELECT_10:
870
    case SEND_DIAGNOSTIC:
871
    case WRITE_BUFFER:
872
    case FORMAT_UNIT:
873
    case REASSIGN_BLOCKS:
874
    case SEARCH_EQUAL:
875
    case SEARCH_HIGH:
876
    case SEARCH_LOW:
877
    case UPDATE_BLOCK:
878
    case WRITE_LONG_10:
879
    case WRITE_SAME_10:
880
    case SEARCH_HIGH_12:
881
    case SEARCH_EQUAL_12:
882
    case SEARCH_LOW_12:
883
    case MEDIUM_SCAN:
884
    case SEND_VOLUME_TAG:
885
    case SEND_CUE_SHEET:
886
    case SEND_DVD_STRUCTURE:
887
    case PERSISTENT_RESERVE_OUT:
888
    case MAINTENANCE_OUT:
889
        cmd->mode = SCSI_XFER_TO_DEV;
890
        break;
891
    default:
892
        if (cmd->xfer)
893
            cmd->mode = SCSI_XFER_FROM_DEV;
894
        else {
895
            cmd->mode = SCSI_XFER_NONE;
896
        }
897
        break;
898
    }
899
}
900

    
901
static uint64_t scsi_cmd_lba(SCSICommand *cmd)
902
{
903
    uint8_t *buf = cmd->buf;
904
    uint64_t lba;
905

    
906
    switch (buf[0] >> 5) {
907
    case 0:
908
        lba = ldl_be_p(&buf[0]) & 0x1fffff;
909
        break;
910
    case 1:
911
    case 2:
912
    case 5:
913
        lba = ldl_be_p(&buf[2]) & 0xffffffffULL;
914
        break;
915
    case 4:
916
        lba = ldq_be_p(&buf[2]);
917
        break;
918
    default:
919
        lba = -1;
920

    
921
    }
922
    return lba;
923
}
924

    
925
int scsi_req_parse(SCSICommand *cmd, SCSIDevice *dev, uint8_t *buf)
926
{
927
    int rc;
928

    
929
    if (dev->type == TYPE_TAPE) {
930
        rc = scsi_req_stream_length(cmd, dev, buf);
931
    } else {
932
        rc = scsi_req_length(cmd, dev, buf);
933
    }
934
    if (rc != 0)
935
        return rc;
936

    
937
    memcpy(cmd->buf, buf, cmd->len);
938
    scsi_cmd_xfer_mode(cmd);
939
    cmd->lba = scsi_cmd_lba(cmd);
940
    return 0;
941
}
942

    
943
/*
944
 * Predefined sense codes
945
 */
946

    
947
/* No sense data available */
948
const struct SCSISense sense_code_NO_SENSE = {
949
    .key = NO_SENSE , .asc = 0x00 , .ascq = 0x00
950
};
951

    
952
/* LUN not ready, Manual intervention required */
953
const struct SCSISense sense_code_LUN_NOT_READY = {
954
    .key = NOT_READY, .asc = 0x04, .ascq = 0x03
955
};
956

    
957
/* LUN not ready, Medium not present */
958
const struct SCSISense sense_code_NO_MEDIUM = {
959
    .key = NOT_READY, .asc = 0x3a, .ascq = 0x00
960
};
961

    
962
/* LUN not ready, medium removal prevented */
963
const struct SCSISense sense_code_NOT_READY_REMOVAL_PREVENTED = {
964
    .key = NOT_READY, .asc = 0x53, .ascq = 0x00
965
};
966

    
967
/* Hardware error, internal target failure */
968
const struct SCSISense sense_code_TARGET_FAILURE = {
969
    .key = HARDWARE_ERROR, .asc = 0x44, .ascq = 0x00
970
};
971

    
972
/* Illegal request, invalid command operation code */
973
const struct SCSISense sense_code_INVALID_OPCODE = {
974
    .key = ILLEGAL_REQUEST, .asc = 0x20, .ascq = 0x00
975
};
976

    
977
/* Illegal request, LBA out of range */
978
const struct SCSISense sense_code_LBA_OUT_OF_RANGE = {
979
    .key = ILLEGAL_REQUEST, .asc = 0x21, .ascq = 0x00
980
};
981

    
982
/* Illegal request, Invalid field in CDB */
983
const struct SCSISense sense_code_INVALID_FIELD = {
984
    .key = ILLEGAL_REQUEST, .asc = 0x24, .ascq = 0x00
985
};
986

    
987
/* Illegal request, LUN not supported */
988
const struct SCSISense sense_code_LUN_NOT_SUPPORTED = {
989
    .key = ILLEGAL_REQUEST, .asc = 0x25, .ascq = 0x00
990
};
991

    
992
/* Illegal request, Saving parameters not supported */
993
const struct SCSISense sense_code_SAVING_PARAMS_NOT_SUPPORTED = {
994
    .key = ILLEGAL_REQUEST, .asc = 0x39, .ascq = 0x00
995
};
996

    
997
/* Illegal request, Incompatible medium installed */
998
const struct SCSISense sense_code_INCOMPATIBLE_FORMAT = {
999
    .key = ILLEGAL_REQUEST, .asc = 0x30, .ascq = 0x00
1000
};
1001

    
1002
/* Illegal request, medium removal prevented */
1003
const struct SCSISense sense_code_ILLEGAL_REQ_REMOVAL_PREVENTED = {
1004
    .key = ILLEGAL_REQUEST, .asc = 0x53, .ascq = 0x00
1005
};
1006

    
1007
/* Command aborted, I/O process terminated */
1008
const struct SCSISense sense_code_IO_ERROR = {
1009
    .key = ABORTED_COMMAND, .asc = 0x00, .ascq = 0x06
1010
};
1011

    
1012
/* Command aborted, I_T Nexus loss occurred */
1013
const struct SCSISense sense_code_I_T_NEXUS_LOSS = {
1014
    .key = ABORTED_COMMAND, .asc = 0x29, .ascq = 0x07
1015
};
1016

    
1017
/* Command aborted, Logical Unit failure */
1018
const struct SCSISense sense_code_LUN_FAILURE = {
1019
    .key = ABORTED_COMMAND, .asc = 0x3e, .ascq = 0x01
1020
};
1021

    
1022
/* Unit attention, Power on, reset or bus device reset occurred */
1023
const struct SCSISense sense_code_RESET = {
1024
    .key = UNIT_ATTENTION, .asc = 0x29, .ascq = 0x00
1025
};
1026

    
1027
/* Unit attention, No medium */
1028
const struct SCSISense sense_code_UNIT_ATTENTION_NO_MEDIUM = {
1029
    .key = UNIT_ATTENTION, .asc = 0x3a, .ascq = 0x00
1030
};
1031

    
1032
/* Unit attention, Medium may have changed */
1033
const struct SCSISense sense_code_MEDIUM_CHANGED = {
1034
    .key = UNIT_ATTENTION, .asc = 0x28, .ascq = 0x00
1035
};
1036

    
1037
/* Unit attention, Reported LUNs data has changed */
1038
const struct SCSISense sense_code_REPORTED_LUNS_CHANGED = {
1039
    .key = UNIT_ATTENTION, .asc = 0x3f, .ascq = 0x0e
1040
};
1041

    
1042
/* Unit attention, Device internal reset */
1043
const struct SCSISense sense_code_DEVICE_INTERNAL_RESET = {
1044
    .key = UNIT_ATTENTION, .asc = 0x29, .ascq = 0x04
1045
};
1046

    
1047
/*
1048
 * scsi_build_sense
1049
 *
1050
 * Convert between fixed and descriptor sense buffers
1051
 */
1052
int scsi_build_sense(uint8_t *in_buf, int in_len,
1053
                     uint8_t *buf, int len, bool fixed)
1054
{
1055
    bool fixed_in;
1056
    SCSISense sense;
1057
    if (!fixed && len < 8) {
1058
        return 0;
1059
    }
1060

    
1061
    if (in_len == 0) {
1062
        sense.key = NO_SENSE;
1063
        sense.asc = 0;
1064
        sense.ascq = 0;
1065
    } else {
1066
        fixed_in = (in_buf[0] & 2) == 0;
1067

    
1068
        if (fixed == fixed_in) {
1069
            memcpy(buf, in_buf, MIN(len, in_len));
1070
            return MIN(len, in_len);
1071
        }
1072

    
1073
        if (fixed_in) {
1074
            sense.key = in_buf[2];
1075
            sense.asc = in_buf[12];
1076
            sense.ascq = in_buf[13];
1077
        } else {
1078
            sense.key = in_buf[1];
1079
            sense.asc = in_buf[2];
1080
            sense.ascq = in_buf[3];
1081
        }
1082
    }
1083

    
1084
    memset(buf, 0, len);
1085
    if (fixed) {
1086
        /* Return fixed format sense buffer */
1087
        buf[0] = 0xf0;
1088
        buf[2] = sense.key;
1089
        buf[7] = 10;
1090
        buf[12] = sense.asc;
1091
        buf[13] = sense.ascq;
1092
        return MIN(len, 18);
1093
    } else {
1094
        /* Return descriptor format sense buffer */
1095
        buf[0] = 0x72;
1096
        buf[1] = sense.key;
1097
        buf[2] = sense.asc;
1098
        buf[3] = sense.ascq;
1099
        return 8;
1100
    }
1101
}
1102

    
1103
static const char *scsi_command_name(uint8_t cmd)
1104
{
1105
    static const char *names[] = {
1106
        [ TEST_UNIT_READY          ] = "TEST_UNIT_READY",
1107
        [ REWIND                   ] = "REWIND",
1108
        [ REQUEST_SENSE            ] = "REQUEST_SENSE",
1109
        [ FORMAT_UNIT              ] = "FORMAT_UNIT",
1110
        [ READ_BLOCK_LIMITS        ] = "READ_BLOCK_LIMITS",
1111
        [ REASSIGN_BLOCKS          ] = "REASSIGN_BLOCKS",
1112
        [ READ_6                   ] = "READ_6",
1113
        [ WRITE_6                  ] = "WRITE_6",
1114
        [ SET_CAPACITY             ] = "SET_CAPACITY",
1115
        [ READ_REVERSE             ] = "READ_REVERSE",
1116
        [ WRITE_FILEMARKS          ] = "WRITE_FILEMARKS",
1117
        [ SPACE                    ] = "SPACE",
1118
        [ INQUIRY                  ] = "INQUIRY",
1119
        [ RECOVER_BUFFERED_DATA    ] = "RECOVER_BUFFERED_DATA",
1120
        [ MAINTENANCE_IN           ] = "MAINTENANCE_IN",
1121
        [ MAINTENANCE_OUT          ] = "MAINTENANCE_OUT",
1122
        [ MODE_SELECT              ] = "MODE_SELECT",
1123
        [ RESERVE                  ] = "RESERVE",
1124
        [ RELEASE                  ] = "RELEASE",
1125
        [ COPY                     ] = "COPY",
1126
        [ ERASE                    ] = "ERASE",
1127
        [ MODE_SENSE               ] = "MODE_SENSE",
1128
        [ START_STOP               ] = "START_STOP",
1129
        [ RECEIVE_DIAGNOSTIC       ] = "RECEIVE_DIAGNOSTIC",
1130
        [ SEND_DIAGNOSTIC          ] = "SEND_DIAGNOSTIC",
1131
        [ ALLOW_MEDIUM_REMOVAL     ] = "ALLOW_MEDIUM_REMOVAL",
1132
        [ READ_CAPACITY_10         ] = "READ_CAPACITY_10",
1133
        [ READ_10                  ] = "READ_10",
1134
        [ WRITE_10                 ] = "WRITE_10",
1135
        [ SEEK_10                  ] = "SEEK_10",
1136
        [ WRITE_VERIFY_10          ] = "WRITE_VERIFY_10",
1137
        [ VERIFY_10                ] = "VERIFY_10",
1138
        [ SEARCH_HIGH              ] = "SEARCH_HIGH",
1139
        [ SEARCH_EQUAL             ] = "SEARCH_EQUAL",
1140
        [ SEARCH_LOW               ] = "SEARCH_LOW",
1141
        [ SET_LIMITS               ] = "SET_LIMITS",
1142
        [ PRE_FETCH                ] = "PRE_FETCH/READ_POSITION",
1143
        /* READ_POSITION and PRE_FETCH use the same operation code */
1144
        [ SYNCHRONIZE_CACHE        ] = "SYNCHRONIZE_CACHE",
1145
        [ LOCK_UNLOCK_CACHE        ] = "LOCK_UNLOCK_CACHE",
1146
        [ READ_DEFECT_DATA         ] = "READ_DEFECT_DATA",
1147
        [ MEDIUM_SCAN              ] = "MEDIUM_SCAN",
1148
        [ COMPARE                  ] = "COMPARE",
1149
        [ COPY_VERIFY              ] = "COPY_VERIFY",
1150
        [ WRITE_BUFFER             ] = "WRITE_BUFFER",
1151
        [ READ_BUFFER              ] = "READ_BUFFER",
1152
        [ UPDATE_BLOCK             ] = "UPDATE_BLOCK",
1153
        [ READ_LONG_10             ] = "READ_LONG_10",
1154
        [ WRITE_LONG_10            ] = "WRITE_LONG_10",
1155
        [ CHANGE_DEFINITION        ] = "CHANGE_DEFINITION",
1156
        [ WRITE_SAME_10            ] = "WRITE_SAME_10",
1157
        [ UNMAP                    ] = "UNMAP",
1158
        [ READ_TOC                 ] = "READ_TOC",
1159
        [ REPORT_DENSITY_SUPPORT   ] = "REPORT_DENSITY_SUPPORT",
1160
        [ GET_CONFIGURATION        ] = "GET_CONFIGURATION",
1161
        [ LOG_SELECT               ] = "LOG_SELECT",
1162
        [ LOG_SENSE                ] = "LOG_SENSE",
1163
        [ MODE_SELECT_10           ] = "MODE_SELECT_10",
1164
        [ RESERVE_10               ] = "RESERVE_10",
1165
        [ RELEASE_10               ] = "RELEASE_10",
1166
        [ MODE_SENSE_10            ] = "MODE_SENSE_10",
1167
        [ PERSISTENT_RESERVE_IN    ] = "PERSISTENT_RESERVE_IN",
1168
        [ PERSISTENT_RESERVE_OUT   ] = "PERSISTENT_RESERVE_OUT",
1169
        [ WRITE_FILEMARKS_16       ] = "WRITE_FILEMARKS_16",
1170
        [ EXTENDED_COPY            ] = "EXTENDED_COPY",
1171
        [ ATA_PASSTHROUGH          ] = "ATA_PASSTHROUGH",
1172
        [ ACCESS_CONTROL_IN        ] = "ACCESS_CONTROL_IN",
1173
        [ ACCESS_CONTROL_OUT       ] = "ACCESS_CONTROL_OUT",
1174
        [ READ_16                  ] = "READ_16",
1175
        [ COMPARE_AND_WRITE        ] = "COMPARE_AND_WRITE",
1176
        [ WRITE_16                 ] = "WRITE_16",
1177
        [ WRITE_VERIFY_16          ] = "WRITE_VERIFY_16",
1178
        [ VERIFY_16                ] = "VERIFY_16",
1179
        [ PRE_FETCH_16             ] = "PRE_FETCH_16",
1180
        [ SYNCHRONIZE_CACHE_16     ] = "SPACE_16/SYNCHRONIZE_CACHE_16",
1181
        /* SPACE_16 and SYNCHRONIZE_CACHE_16 use the same operation code */
1182
        [ LOCATE_16                ] = "LOCATE_16",
1183
        [ WRITE_SAME_16            ] = "ERASE_16/WRITE_SAME_16",
1184
        /* ERASE_16 and WRITE_SAME_16 use the same operation code */
1185
        [ SERVICE_ACTION_IN_16     ] = "SERVICE_ACTION_IN_16",
1186
        [ WRITE_LONG_16            ] = "WRITE_LONG_16",
1187
        [ REPORT_LUNS              ] = "REPORT_LUNS",
1188
        [ BLANK                    ] = "BLANK",
1189
        [ MOVE_MEDIUM              ] = "MOVE_MEDIUM",
1190
        [ LOAD_UNLOAD              ] = "LOAD_UNLOAD",
1191
        [ READ_12                  ] = "READ_12",
1192
        [ WRITE_12                 ] = "WRITE_12",
1193
        [ ERASE_12                 ] = "ERASE_12/GET_PERFORMANCE",
1194
        /* ERASE_12 and GET_PERFORMANCE use the same operation code */
1195
        [ SERVICE_ACTION_IN_12     ] = "SERVICE_ACTION_IN_12",
1196
        [ WRITE_VERIFY_12          ] = "WRITE_VERIFY_12",
1197
        [ VERIFY_12                ] = "VERIFY_12",
1198
        [ SEARCH_HIGH_12           ] = "SEARCH_HIGH_12",
1199
        [ SEARCH_EQUAL_12          ] = "SEARCH_EQUAL_12",
1200
        [ SEARCH_LOW_12            ] = "SEARCH_LOW_12",
1201
        [ READ_ELEMENT_STATUS      ] = "READ_ELEMENT_STATUS",
1202
        [ SEND_VOLUME_TAG          ] = "SEND_VOLUME_TAG/SET_STREAMING",
1203
        /* SEND_VOLUME_TAG and SET_STREAMING use the same operation code */
1204
        [ READ_CD                  ] = "READ_CD",
1205
        [ READ_DEFECT_DATA_12      ] = "READ_DEFECT_DATA_12",
1206
        [ READ_DVD_STRUCTURE       ] = "READ_DVD_STRUCTURE",
1207
        [ RESERVE_TRACK            ] = "RESERVE_TRACK",
1208
        [ SEND_CUE_SHEET           ] = "SEND_CUE_SHEET",
1209
        [ SEND_DVD_STRUCTURE       ] = "SEND_DVD_STRUCTURE",
1210
        [ SET_CD_SPEED             ] = "SET_CD_SPEED",
1211
        [ SET_READ_AHEAD           ] = "SET_READ_AHEAD",
1212
        [ ALLOW_OVERWRITE          ] = "ALLOW_OVERWRITE",
1213
        [ MECHANISM_STATUS         ] = "MECHANISM_STATUS",
1214
    };
1215

    
1216
    if (cmd >= ARRAY_SIZE(names) || names[cmd] == NULL)
1217
        return "*UNKNOWN*";
1218
    return names[cmd];
1219
}
1220

    
1221
SCSIRequest *scsi_req_ref(SCSIRequest *req)
1222
{
1223
    req->refcount++;
1224
    return req;
1225
}
1226

    
1227
void scsi_req_unref(SCSIRequest *req)
1228
{
1229
    if (--req->refcount == 0) {
1230
        if (req->ops->free_req) {
1231
            req->ops->free_req(req);
1232
        }
1233
        g_free(req);
1234
    }
1235
}
1236

    
1237
/* Tell the device that we finished processing this chunk of I/O.  It
1238
   will start the next chunk or complete the command.  */
1239
void scsi_req_continue(SCSIRequest *req)
1240
{
1241
    trace_scsi_req_continue(req->dev->id, req->lun, req->tag);
1242
    if (req->cmd.mode == SCSI_XFER_TO_DEV) {
1243
        req->ops->write_data(req);
1244
    } else {
1245
        req->ops->read_data(req);
1246
    }
1247
}
1248

    
1249
/* Called by the devices when data is ready for the HBA.  The HBA should
1250
   start a DMA operation to read or fill the device's data buffer.
1251
   Once it completes, calling scsi_req_continue will restart I/O.  */
1252
void scsi_req_data(SCSIRequest *req, int len)
1253
{
1254
    if (req->io_canceled) {
1255
        trace_scsi_req_data_canceled(req->dev->id, req->lun, req->tag, len);
1256
    } else {
1257
        trace_scsi_req_data(req->dev->id, req->lun, req->tag, len);
1258
        req->bus->info->transfer_data(req, len);
1259
    }
1260
}
1261

    
1262
void scsi_req_print(SCSIRequest *req)
1263
{
1264
    FILE *fp = stderr;
1265
    int i;
1266

    
1267
    fprintf(fp, "[%s id=%d] %s",
1268
            req->dev->qdev.parent_bus->name,
1269
            req->dev->id,
1270
            scsi_command_name(req->cmd.buf[0]));
1271
    for (i = 1; i < req->cmd.len; i++) {
1272
        fprintf(fp, " 0x%02x", req->cmd.buf[i]);
1273
    }
1274
    switch (req->cmd.mode) {
1275
    case SCSI_XFER_NONE:
1276
        fprintf(fp, " - none\n");
1277
        break;
1278
    case SCSI_XFER_FROM_DEV:
1279
        fprintf(fp, " - from-dev len=%zd\n", req->cmd.xfer);
1280
        break;
1281
    case SCSI_XFER_TO_DEV:
1282
        fprintf(fp, " - to-dev len=%zd\n", req->cmd.xfer);
1283
        break;
1284
    default:
1285
        fprintf(fp, " - Oops\n");
1286
        break;
1287
    }
1288
}
1289

    
1290
void scsi_req_complete(SCSIRequest *req, int status)
1291
{
1292
    assert(req->status == -1);
1293
    req->status = status;
1294

    
1295
    assert(req->sense_len < sizeof(req->sense));
1296
    if (status == GOOD) {
1297
        req->sense_len = 0;
1298
    }
1299

    
1300
    if (req->sense_len) {
1301
        memcpy(req->dev->sense, req->sense, req->sense_len);
1302
        req->dev->sense_len = req->sense_len;
1303
        req->dev->sense_is_ua = (req->ops == &reqops_unit_attention);
1304
    } else {
1305
        req->dev->sense_len = 0;
1306
        req->dev->sense_is_ua = false;
1307
    }
1308

    
1309
    /*
1310
     * Unit attention state is now stored in the device's sense buffer
1311
     * if the HBA didn't do autosense.  Clear the pending unit attention
1312
     * flags.
1313
     */
1314
    scsi_clear_unit_attention(req);
1315

    
1316
    scsi_req_ref(req);
1317
    scsi_req_dequeue(req);
1318
    req->bus->info->complete(req, req->status);
1319
    scsi_req_unref(req);
1320
}
1321

    
1322
void scsi_req_cancel(SCSIRequest *req)
1323
{
1324
    if (!req->enqueued) {
1325
        return;
1326
    }
1327
    scsi_req_ref(req);
1328
    scsi_req_dequeue(req);
1329
    req->io_canceled = true;
1330
    if (req->ops->cancel_io) {
1331
        req->ops->cancel_io(req);
1332
    }
1333
    if (req->bus->info->cancel) {
1334
        req->bus->info->cancel(req);
1335
    }
1336
    scsi_req_unref(req);
1337
}
1338

    
1339
void scsi_req_abort(SCSIRequest *req, int status)
1340
{
1341
    if (!req->enqueued) {
1342
        return;
1343
    }
1344
    scsi_req_ref(req);
1345
    scsi_req_dequeue(req);
1346
    req->io_canceled = true;
1347
    if (req->ops->cancel_io) {
1348
        req->ops->cancel_io(req);
1349
    }
1350
    scsi_req_complete(req, status);
1351
    scsi_req_unref(req);
1352
}
1353

    
1354
void scsi_device_purge_requests(SCSIDevice *sdev, SCSISense sense)
1355
{
1356
    SCSIRequest *req;
1357

    
1358
    while (!QTAILQ_EMPTY(&sdev->requests)) {
1359
        req = QTAILQ_FIRST(&sdev->requests);
1360
        scsi_req_cancel(req);
1361
    }
1362
    sdev->unit_attention = sense;
1363
}
1364

    
1365
static char *scsibus_get_fw_dev_path(DeviceState *dev)
1366
{
1367
    SCSIDevice *d = DO_UPCAST(SCSIDevice, qdev, dev);
1368
    char path[100];
1369

    
1370
    snprintf(path, sizeof(path), "%s@%d,%d,%d", qdev_fw_name(dev),
1371
             d->channel, d->id, d->lun);
1372

    
1373
    return strdup(path);
1374
}
1375

    
1376
SCSIDevice *scsi_device_find(SCSIBus *bus, int channel, int id, int lun)
1377
{
1378
    DeviceState *qdev;
1379
    SCSIDevice *target_dev = NULL;
1380

    
1381
    QTAILQ_FOREACH_REVERSE(qdev, &bus->qbus.children, ChildrenHead, sibling) {
1382
        SCSIDevice *dev = DO_UPCAST(SCSIDevice, qdev, qdev);
1383

    
1384
        if (dev->channel == channel && dev->id == id) {
1385
            if (dev->lun == lun) {
1386
                return dev;
1387
            }
1388
            target_dev = dev;
1389
        }
1390
    }
1391
    return target_dev;
1392
}