Revision 5c6c0e51 hw/scsi-bus.c
b/hw/scsi-bus.c | ||
---|---|---|
136 | 136 |
SCSIRequest *req; |
137 | 137 |
|
138 | 138 |
req = qemu_mallocz(size); |
139 |
/* Two references: one is passed back to the HBA, one is in d->requests. */ |
|
140 |
req->refcount = 2; |
|
139 |
req->refcount = 1; |
|
141 | 140 |
req->bus = scsi_bus_from_device(d); |
142 | 141 |
req->dev = d; |
143 | 142 |
req->tag = tag; |
144 | 143 |
req->lun = lun; |
145 | 144 |
req->status = -1; |
146 |
req->enqueued = true; |
|
147 | 145 |
trace_scsi_req_alloc(req->dev->id, req->lun, req->tag); |
148 |
QTAILQ_INSERT_TAIL(&d->requests, req, next); |
|
149 | 146 |
return req; |
150 | 147 |
} |
151 | 148 |
|
152 |
SCSIRequest *scsi_req_find(SCSIDevice *d, uint32_t tag)
|
|
149 |
void scsi_req_enqueue(SCSIRequest *req)
|
|
153 | 150 |
{ |
154 |
SCSIRequest *req; |
|
155 |
|
|
156 |
QTAILQ_FOREACH(req, &d->requests, next) { |
|
157 |
if (req->tag == tag) { |
|
158 |
return req; |
|
159 |
} |
|
160 |
} |
|
161 |
return NULL; |
|
151 |
assert(!req->enqueued); |
|
152 |
scsi_req_ref(req); |
|
153 |
req->enqueued = true; |
|
154 |
QTAILQ_INSERT_TAIL(&req->dev->requests, req, next); |
|
162 | 155 |
} |
163 | 156 |
|
164 | 157 |
void scsi_req_dequeue(SCSIRequest *req) |
... | ... | |
516 | 509 |
void scsi_req_data(SCSIRequest *req, int len) |
517 | 510 |
{ |
518 | 511 |
trace_scsi_req_data(req->dev->id, req->lun, req->tag, len); |
519 |
req->bus->ops->complete(req->bus, SCSI_REASON_DATA, req->tag, len);
|
|
512 |
req->bus->ops->complete(req, SCSI_REASON_DATA, len);
|
|
520 | 513 |
} |
521 | 514 |
|
522 | 515 |
void scsi_req_print(SCSIRequest *req) |
... | ... | |
552 | 545 |
assert(req->status != -1); |
553 | 546 |
scsi_req_ref(req); |
554 | 547 |
scsi_req_dequeue(req); |
555 |
req->bus->ops->complete(req->bus, SCSI_REASON_DONE, |
|
556 |
req->tag, |
|
557 |
req->status); |
|
548 |
req->bus->ops->complete(req, SCSI_REASON_DONE, req->status); |
|
558 | 549 |
scsi_req_unref(req); |
559 | 550 |
} |
560 | 551 |
|
Also available in: Unified diff