Revision c5bf71a9 hw/spapr_vscsi.c
b/hw/spapr_vscsi.c | ||
---|---|---|
121 | 121 |
return NULL; |
122 | 122 |
} |
123 | 123 |
|
124 |
static void vscsi_put_req(VSCSIState *s, vscsi_req *req)
|
|
124 |
static void vscsi_put_req(vscsi_req *req) |
|
125 | 125 |
{ |
126 | 126 |
if (req->sreq != NULL) { |
127 | 127 |
scsi_req_unref(req->sreq); |
... | ... | |
130 | 130 |
req->active = 0; |
131 | 131 |
} |
132 | 132 |
|
133 |
static vscsi_req *vscsi_find_req(VSCSIState *s, SCSIRequest *req) |
|
134 |
{ |
|
135 |
uint32_t tag = req->tag; |
|
136 |
if (tag >= VSCSI_REQ_LIMIT || !s->reqs[tag].active) { |
|
137 |
return NULL; |
|
138 |
} |
|
139 |
return &s->reqs[tag]; |
|
140 |
} |
|
141 |
|
|
142 | 133 |
static void vscsi_decode_id_lun(uint64_t srp_lun, int *id, int *lun) |
143 | 134 |
{ |
144 | 135 |
/* XXX Figure that one out properly ! This is crackpot */ |
... | ... | |
454 | 445 |
if (n) { |
455 | 446 |
req->senselen = n; |
456 | 447 |
vscsi_send_rsp(s, req, CHECK_CONDITION, 0, 0); |
457 |
vscsi_put_req(s, req);
|
|
448 |
vscsi_put_req(req); |
|
458 | 449 |
return; |
459 | 450 |
} |
460 | 451 |
|
... | ... | |
483 | 474 |
static void vscsi_transfer_data(SCSIRequest *sreq, uint32_t len) |
484 | 475 |
{ |
485 | 476 |
VSCSIState *s = DO_UPCAST(VSCSIState, vdev.qdev, sreq->bus->qbus.parent); |
486 |
vscsi_req *req = vscsi_find_req(s, sreq);
|
|
477 |
vscsi_req *req = sreq->hba_private;
|
|
487 | 478 |
uint8_t *buf; |
488 | 479 |
int rc = 0; |
489 | 480 |
|
... | ... | |
531 | 522 |
static void vscsi_command_complete(SCSIRequest *sreq, uint32_t status) |
532 | 523 |
{ |
533 | 524 |
VSCSIState *s = DO_UPCAST(VSCSIState, vdev.qdev, sreq->bus->qbus.parent); |
534 |
vscsi_req *req = vscsi_find_req(s, sreq);
|
|
525 |
vscsi_req *req = sreq->hba_private;
|
|
535 | 526 |
int32_t res_in = 0, res_out = 0; |
536 | 527 |
|
537 | 528 |
dprintf("VSCSI: SCSI cmd complete, r=0x%x tag=0x%x status=0x%x, req=%p\n", |
... | ... | |
563 | 554 |
} |
564 | 555 |
} |
565 | 556 |
vscsi_send_rsp(s, req, 0, res_in, res_out); |
566 |
vscsi_put_req(s, req);
|
|
557 |
vscsi_put_req(req); |
|
567 | 558 |
} |
568 | 559 |
|
569 | 560 |
static void vscsi_request_cancelled(SCSIRequest *sreq) |
570 | 561 |
{ |
571 |
VSCSIState *s = DO_UPCAST(VSCSIState, vdev.qdev, sreq->bus->qbus.parent); |
|
572 |
vscsi_req *req = vscsi_find_req(s, sreq); |
|
562 |
vscsi_req *req = sreq->hba_private; |
|
573 | 563 |
|
574 |
vscsi_put_req(s, req);
|
|
564 |
vscsi_put_req(req); |
|
575 | 565 |
} |
576 | 566 |
|
577 | 567 |
static void vscsi_process_login(VSCSIState *s, vscsi_req *req) |
... | ... | |
659 | 649 |
} |
660 | 650 |
|
661 | 651 |
req->lun = lun; |
662 |
req->sreq = scsi_req_new(sdev, req->qtag, lun); |
|
652 |
req->sreq = scsi_req_new(sdev, req->qtag, lun, req);
|
|
663 | 653 |
n = scsi_req_enqueue(req->sreq, srp->cmd.cdb); |
664 | 654 |
|
665 | 655 |
dprintf("VSCSI: Queued command tag 0x%x CMD 0x%x ID %d LUN %d ret: %d\n", |
... | ... | |
858 | 848 |
} |
859 | 849 |
|
860 | 850 |
if (done) { |
861 |
vscsi_put_req(s, req);
|
|
851 |
vscsi_put_req(req); |
|
862 | 852 |
} |
863 | 853 |
} |
864 | 854 |
|
Also available in: Unified diff