Revision 5c6c0e51 hw/spapr_vscsi.c

b/hw/spapr_vscsi.c
75 75

  
76 76
    /* SCSI request tracking */
77 77
    SCSIDevice              *sdev;
78
    SCSIRequest             *sreq;
78 79
    uint32_t                qtag; /* qemu tag != srp tag */
79 80
    int                     lun;
80 81
    int                     active;
......
123 124

  
124 125
static void vscsi_put_req(VSCSIState *s, vscsi_req *req)
125 126
{
127
    if (req->sreq != NULL) {
128
        scsi_req_unref(req->sreq);
129
    }
130
    req->sreq = NULL;
126 131
    req->active = 0;
127 132
}
128 133

  
129
static vscsi_req *vscsi_find_req(VSCSIState *s, uint32_t tag)
134
static vscsi_req *vscsi_find_req(VSCSIState *s, SCSIRequest *req)
130 135
{
136
    uint32_t tag = req->tag;
131 137
    if (tag >= VSCSI_REQ_LIMIT || !s->reqs[tag].active) {
132 138
        return NULL;
133 139
    }
......
453 459
    cdb[4] = 96;
454 460
    cdb[5] = 0;
455 461
    req->sensing = 1;
456
    n = sdev->info->send_command(sdev, req->qtag, cdb, req->lun);
462
    n = sdev->info->send_command(req->sreq, cdb);
457 463
    dprintf("VSCSI: Queued request sense tag 0x%x\n", req->qtag);
458 464
    if (n < 0) {
459 465
        fprintf(stderr, "VSCSI: REQUEST_SENSE wants write data !?!?!?\n");
460
        sdev->info->cancel_io(sdev, req->qtag);
466
        sdev->info->cancel_io(req->sreq);
461 467
        vscsi_makeup_sense(s, req, HARDWARE_ERROR, 0, 0);
462 468
        vscsi_send_rsp(s, req, CHECK_CONDITION, 0, 0);
463 469
        vscsi_put_req(s, req);
......
465 471
    } else if (n == 0) {
466 472
        return;
467 473
    }
468
    sdev->info->read_data(sdev, req->qtag);
474
    sdev->info->read_data(req->sreq);
469 475
}
470 476

  
471 477
/* Callback to indicate that the SCSI layer has completed a transfer.  */
472
static void vscsi_command_complete(SCSIBus *bus, int reason, uint32_t tag,
473
                                   uint32_t arg)
478
static void vscsi_command_complete(SCSIRequest *sreq, int reason, uint32_t arg)
474 479
{
475
    VSCSIState *s = DO_UPCAST(VSCSIState, vdev.qdev, bus->qbus.parent);
476
    vscsi_req *req = vscsi_find_req(s, tag);
480
    VSCSIState *s = DO_UPCAST(VSCSIState, vdev.qdev, sreq->bus->qbus.parent);
481
    vscsi_req *req = vscsi_find_req(s, sreq);
477 482
    SCSIDevice *sdev;
478 483
    uint8_t *buf;
479 484
    int32_t res_in = 0, res_out = 0;
480 485
    int len, rc = 0;
481 486

  
482 487
    dprintf("VSCSI: SCSI cmd complete, r=0x%x tag=0x%x arg=0x%x, req=%p\n",
483
            reason, tag, arg, req);
488
            reason, sreq->tag, arg, req);
484 489
    if (req == NULL) {
485
        fprintf(stderr, "VSCSI: Can't find request for tag 0x%x\n", tag);
490
        fprintf(stderr, "VSCSI: Can't find request for tag 0x%x\n", sreq->tag);
486 491
        return;
487 492
    }
488 493
    sdev = req->sdev;
......
493 498
            vscsi_send_rsp(s, req, CHECK_CONDITION, 0, 0);
494 499
            vscsi_put_req(s, req);
495 500
        } else {
496
            uint8_t *buf = sdev->info->get_buf(sdev, tag);
501
            uint8_t *buf = sdev->info->get_buf(sreq);
497 502

  
498 503
            len = MIN(arg, SCSI_SENSE_BUF_SIZE);
499 504
            dprintf("VSCSI: Sense data, %d bytes:\n", len);
......
505 510
                    buf[12], buf[13], buf[14], buf[15]);
506 511
            memcpy(req->sense, buf, len);
507 512
            req->senselen = len;
508
            sdev->info->read_data(sdev, req->qtag);
513
            sdev->info->read_data(sreq);
509 514
        }
510 515
        return;
511 516
    }
......
537 542
     * to write for writes (ie, how much is to be DMA'd)
538 543
     */
539 544
    if (arg) {
540
        buf = sdev->info->get_buf(sdev, tag);
545
        buf = sdev->info->get_buf(sreq);
541 546
        rc = vscsi_srp_transfer_data(s, req, req->writing, buf, arg);
542 547
    }
543 548
    if (rc < 0) {
544 549
        fprintf(stderr, "VSCSI: RDMA error rc=%d!\n", rc);
545
        sdev->info->cancel_io(sdev, req->qtag);
550
        sdev->info->cancel_io(sreq);
546 551
        vscsi_makeup_sense(s, req, HARDWARE_ERROR, 0, 0);
547 552
        vscsi_send_rsp(s, req, CHECK_CONDITION, 0, 0);
548 553
        vscsi_put_req(s, req);
......
552 557
    /* Start next chunk */
553 558
    req->data_len -= rc;
554 559
    if (req->writing) {
555
        sdev->info->write_data(sdev, req->qtag);
560
        sdev->info->write_data(sreq);
556 561
    } else {
557
        sdev->info->read_data(sdev, req->qtag);
562
        sdev->info->read_data(sreq);
558 563
    }
559 564
}
560 565

  
......
644 649

  
645 650
    req->sdev = sdev;
646 651
    req->lun = lun;
647
    n = sdev->info->send_command(sdev, req->qtag, srp->cmd.cdb, lun);
652
    req->sreq = sdev->info->alloc_req(sdev, req->qtag, lun);
653
    n = sdev->info->send_command(req->sreq, srp->cmd.cdb);
648 654

  
649 655
    dprintf("VSCSI: Queued command tag 0x%x CMD 0x%x ID %d LUN %d ret: %d\n",
650 656
            req->qtag, srp->cmd.cdb[0], id, lun, n);
......
662 668
    /* Get transfer direction and initiate transfer */
663 669
    if (n > 0) {
664 670
        req->data_len = n;
665
        sdev->info->read_data(sdev, req->qtag);
671
        sdev->info->read_data(req->sreq);
666 672
    } else if (n < 0) {
667 673
        req->data_len = -n;
668
        sdev->info->write_data(sdev, req->qtag);
674
        sdev->info->write_data(req->sreq);
669 675
    }
670 676
    /* Don't touch req here, it may have been recycled already */
671 677

  

Also available in: Unified diff