提交 aba1f023 编写于 作者: P Paolo Bonzini

scsi: rename arguments to the new callbacks

Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
Cc: Christoph Hellwig <hch@lst.de>
上级 c6df7102
...@@ -395,7 +395,7 @@ static void esp_do_dma(ESPState *s) ...@@ -395,7 +395,7 @@ static void esp_do_dma(ESPState *s)
esp_dma_done(s); esp_dma_done(s);
} }
static void esp_command_complete(SCSIRequest *req, uint32_t arg) static void esp_command_complete(SCSIRequest *req, uint32_t status)
{ {
ESPState *s = DO_UPCAST(ESPState, busdev.qdev, req->bus->qbus.parent); ESPState *s = DO_UPCAST(ESPState, busdev.qdev, req->bus->qbus.parent);
...@@ -406,10 +406,10 @@ static void esp_command_complete(SCSIRequest *req, uint32_t arg) ...@@ -406,10 +406,10 @@ static void esp_command_complete(SCSIRequest *req, uint32_t arg)
s->ti_size = 0; s->ti_size = 0;
s->dma_left = 0; s->dma_left = 0;
s->async_len = 0; s->async_len = 0;
if (arg) { if (status) {
DPRINTF("Command failed\n"); DPRINTF("Command failed\n");
} }
s->status = arg; s->status = status;
s->rregs[ESP_RSTAT] = STAT_ST; s->rregs[ESP_RSTAT] = STAT_ST;
esp_dma_done(s); esp_dma_done(s);
if (s->current_req) { if (s->current_req) {
...@@ -419,12 +419,12 @@ static void esp_command_complete(SCSIRequest *req, uint32_t arg) ...@@ -419,12 +419,12 @@ static void esp_command_complete(SCSIRequest *req, uint32_t arg)
} }
} }
static void esp_transfer_data(SCSIRequest *req, uint32_t arg) static void esp_transfer_data(SCSIRequest *req, uint32_t len)
{ {
ESPState *s = DO_UPCAST(ESPState, busdev.qdev, req->bus->qbus.parent); ESPState *s = DO_UPCAST(ESPState, busdev.qdev, req->bus->qbus.parent);
DPRINTF("transfer %d/%d\n", s->dma_left, s->ti_size); DPRINTF("transfer %d/%d\n", s->dma_left, s->ti_size);
s->async_len = arg; s->async_len = len;
s->async_buf = scsi_req_get_buf(req); s->async_buf = scsi_req_get_buf(req);
if (s->dma_left) { if (s->dma_left) {
esp_do_dma(s); esp_do_dma(s);
......
...@@ -680,7 +680,7 @@ static void lsi_request_cancelled(SCSIRequest *req) ...@@ -680,7 +680,7 @@ static void lsi_request_cancelled(SCSIRequest *req)
/* Record that data is available for a queued command. Returns zero if /* Record that data is available for a queued command. Returns zero if
the device was reselected, nonzero if the IO is deferred. */ the device was reselected, nonzero if the IO is deferred. */
static int lsi_queue_tag(LSIState *s, uint32_t tag, uint32_t arg) static int lsi_queue_tag(LSIState *s, uint32_t tag, uint32_t len)
{ {
lsi_request *p; lsi_request *p;
...@@ -693,7 +693,7 @@ static int lsi_queue_tag(LSIState *s, uint32_t tag, uint32_t arg) ...@@ -693,7 +693,7 @@ static int lsi_queue_tag(LSIState *s, uint32_t tag, uint32_t arg)
if (p->pending) { if (p->pending) {
BADF("Multiple IO pending for tag %d\n", tag); BADF("Multiple IO pending for tag %d\n", tag);
} }
p->pending = arg; p->pending = len;
/* Reselect if waiting for it, or if reselection triggers an IRQ /* Reselect if waiting for it, or if reselection triggers an IRQ
and the bus is free. and the bus is free.
Since no interrupt stacking is implemented in the emulation, it Since no interrupt stacking is implemented in the emulation, it
...@@ -707,20 +707,20 @@ static int lsi_queue_tag(LSIState *s, uint32_t tag, uint32_t arg) ...@@ -707,20 +707,20 @@ static int lsi_queue_tag(LSIState *s, uint32_t tag, uint32_t arg)
return 0; return 0;
} else { } else {
DPRINTF("Queueing IO tag=0x%x\n", tag); DPRINTF("Queueing IO tag=0x%x\n", tag);
p->pending = arg; p->pending = len;
return 1; return 1;
} }
} }
/* Callback to indicate that the SCSI layer has completed a command. */ /* Callback to indicate that the SCSI layer has completed a command. */
static void lsi_command_complete(SCSIRequest *req, uint32_t arg) static void lsi_command_complete(SCSIRequest *req, uint32_t status)
{ {
LSIState *s = DO_UPCAST(LSIState, dev.qdev, req->bus->qbus.parent); LSIState *s = DO_UPCAST(LSIState, dev.qdev, req->bus->qbus.parent);
int out; int out;
out = (s->sstat1 & PHASE_MASK) == PHASE_DO; out = (s->sstat1 & PHASE_MASK) == PHASE_DO;
DPRINTF("Command complete status=%d\n", (int)arg); DPRINTF("Command complete status=%d\n", (int)status);
s->status = arg; s->status = status;
s->command_complete = 2; s->command_complete = 2;
if (s->waiting && s->dbc != 0) { if (s->waiting && s->dbc != 0) {
/* Raise phase mismatch for short transfers. */ /* Raise phase mismatch for short transfers. */
...@@ -738,14 +738,14 @@ static void lsi_command_complete(SCSIRequest *req, uint32_t arg) ...@@ -738,14 +738,14 @@ static void lsi_command_complete(SCSIRequest *req, uint32_t arg)
} }
/* Callback to indicate that the SCSI layer has completed a transfer. */ /* Callback to indicate that the SCSI layer has completed a transfer. */
static void lsi_transfer_data(SCSIRequest *req, uint32_t arg) static void lsi_transfer_data(SCSIRequest *req, uint32_t len)
{ {
LSIState *s = DO_UPCAST(LSIState, dev.qdev, req->bus->qbus.parent); LSIState *s = DO_UPCAST(LSIState, dev.qdev, req->bus->qbus.parent);
int out; int out;
if (s->waiting == 1 || !s->current || req->tag != s->current->tag || if (s->waiting == 1 || !s->current || req->tag != s->current->tag ||
(lsi_irq_on_rsl(s) && !(s->scntl1 & LSI_SCNTL1_CON))) { (lsi_irq_on_rsl(s) && !(s->scntl1 & LSI_SCNTL1_CON))) {
if (lsi_queue_tag(s, req->tag, arg)) { if (lsi_queue_tag(s, req->tag, len)) {
return; return;
} }
} }
...@@ -753,8 +753,8 @@ static void lsi_transfer_data(SCSIRequest *req, uint32_t arg) ...@@ -753,8 +753,8 @@ static void lsi_transfer_data(SCSIRequest *req, uint32_t arg)
out = (s->sstat1 & PHASE_MASK) == PHASE_DO; out = (s->sstat1 & PHASE_MASK) == PHASE_DO;
/* host adapter (re)connected */ /* host adapter (re)connected */
DPRINTF("Data ready tag=0x%x len=%d\n", req->tag, arg); DPRINTF("Data ready tag=0x%x len=%d\n", req->tag, len);
s->current->dma_len = arg; s->current->dma_len = len;
s->command_complete = 1; s->command_complete = 1;
if (s->waiting) { if (s->waiting) {
if (s->waiting == 1 || s->dbc == 0) { if (s->waiting == 1 || s->dbc == 0) {
......
...@@ -480,15 +480,15 @@ static void vscsi_send_request_sense(VSCSIState *s, vscsi_req *req) ...@@ -480,15 +480,15 @@ static void vscsi_send_request_sense(VSCSIState *s, vscsi_req *req)
} }
/* Callback to indicate that the SCSI layer has completed a transfer. */ /* Callback to indicate that the SCSI layer has completed a transfer. */
static void vscsi_transfer_data(SCSIRequest *sreq, uint32_t arg) static void vscsi_transfer_data(SCSIRequest *sreq, uint32_t len)
{ {
VSCSIState *s = DO_UPCAST(VSCSIState, vdev.qdev, sreq->bus->qbus.parent); VSCSIState *s = DO_UPCAST(VSCSIState, vdev.qdev, sreq->bus->qbus.parent);
vscsi_req *req = vscsi_find_req(s, sreq); vscsi_req *req = vscsi_find_req(s, sreq);
uint8_t *buf; uint8_t *buf;
int len, rc = 0; int rc = 0;
dprintf("VSCSI: SCSI xfer complete tag=0x%x arg=0x%x, req=%p\n", dprintf("VSCSI: SCSI xfer complete tag=0x%x len=0x%x, req=%p\n",
sreq->tag, arg, req); sreq->tag, len, req);
if (req == NULL) { if (req == NULL) {
fprintf(stderr, "VSCSI: Can't find request for tag 0x%x\n", sreq->tag); fprintf(stderr, "VSCSI: Can't find request for tag 0x%x\n", sreq->tag);
return; return;
...@@ -497,7 +497,7 @@ static void vscsi_transfer_data(SCSIRequest *sreq, uint32_t arg) ...@@ -497,7 +497,7 @@ static void vscsi_transfer_data(SCSIRequest *sreq, uint32_t arg)
if (req->sensing) { if (req->sensing) {
uint8_t *buf = scsi_req_get_buf(sreq); uint8_t *buf = scsi_req_get_buf(sreq);
len = MIN(arg, SCSI_SENSE_BUF_SIZE); len = MIN(len, SCSI_SENSE_BUF_SIZE);
dprintf("VSCSI: Sense data, %d bytes:\n", len); dprintf("VSCSI: Sense data, %d bytes:\n", len);
dprintf(" %02x %02x %02x %02x %02x %02x %02x %02x\n", dprintf(" %02x %02x %02x %02x %02x %02x %02x %02x\n",
buf[0], buf[1], buf[2], buf[3], buf[0], buf[1], buf[2], buf[3],
...@@ -511,12 +511,9 @@ static void vscsi_transfer_data(SCSIRequest *sreq, uint32_t arg) ...@@ -511,12 +511,9 @@ static void vscsi_transfer_data(SCSIRequest *sreq, uint32_t arg)
return; return;
} }
/* "arg" is how much we have read for reads and how much we want if (len) {
* to write for writes (ie, how much is to be DMA'd)
*/
if (arg) {
buf = scsi_req_get_buf(sreq); buf = scsi_req_get_buf(sreq);
rc = vscsi_srp_transfer_data(s, req, req->writing, buf, arg); rc = vscsi_srp_transfer_data(s, req, req->writing, buf, len);
} }
if (rc < 0) { if (rc < 0) {
fprintf(stderr, "VSCSI: RDMA error rc=%d!\n", rc); fprintf(stderr, "VSCSI: RDMA error rc=%d!\n", rc);
...@@ -531,30 +528,30 @@ static void vscsi_transfer_data(SCSIRequest *sreq, uint32_t arg) ...@@ -531,30 +528,30 @@ static void vscsi_transfer_data(SCSIRequest *sreq, uint32_t arg)
} }
/* Callback to indicate that the SCSI layer has completed a transfer. */ /* Callback to indicate that the SCSI layer has completed a transfer. */
static void vscsi_command_complete(SCSIRequest *sreq, uint32_t arg) static void vscsi_command_complete(SCSIRequest *sreq, uint32_t status)
{ {
VSCSIState *s = DO_UPCAST(VSCSIState, vdev.qdev, sreq->bus->qbus.parent); VSCSIState *s = DO_UPCAST(VSCSIState, vdev.qdev, sreq->bus->qbus.parent);
vscsi_req *req = vscsi_find_req(s, sreq); vscsi_req *req = vscsi_find_req(s, sreq);
int32_t res_in = 0, res_out = 0; int32_t res_in = 0, res_out = 0;
dprintf("VSCSI: SCSI cmd complete, r=0x%x tag=0x%x arg=0x%x, req=%p\n", dprintf("VSCSI: SCSI cmd complete, r=0x%x tag=0x%x status=0x%x, req=%p\n",
reason, sreq->tag, arg, req); reason, sreq->tag, status, req);
if (req == NULL) { if (req == NULL) {
fprintf(stderr, "VSCSI: Can't find request for tag 0x%x\n", sreq->tag); fprintf(stderr, "VSCSI: Can't find request for tag 0x%x\n", sreq->tag);
return; return;
} }
if (!req->sensing && arg == CHECK_CONDITION) { if (!req->sensing && status == CHECK_CONDITION) {
vscsi_send_request_sense(s, req); vscsi_send_request_sense(s, req);
return; return;
} }
if (req->sensing) { if (req->sensing) {
dprintf("VSCSI: Sense done !\n"); dprintf("VSCSI: Sense done !\n");
arg = CHECK_CONDITION; status = CHECK_CONDITION;
} else { } else {
dprintf("VSCSI: Command complete err=%d\n", arg); dprintf("VSCSI: Command complete err=%d\n", status);
if (arg == 0) { if (status == 0) {
/* We handle overflows, not underflows for normal commands, /* We handle overflows, not underflows for normal commands,
* but hopefully nobody cares * but hopefully nobody cares
*/ */
......
...@@ -208,7 +208,7 @@ static void usb_msd_send_status(MSDState *s, USBPacket *p) ...@@ -208,7 +208,7 @@ static void usb_msd_send_status(MSDState *s, USBPacket *p)
memcpy(p->data, &csw, len); memcpy(p->data, &csw, len);
} }
static void usb_msd_transfer_data(SCSIRequest *req, uint32_t arg) static void usb_msd_transfer_data(SCSIRequest *req, uint32_t len)
{ {
MSDState *s = DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent); MSDState *s = DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent);
USBPacket *p = s->packet; USBPacket *p = s->packet;
...@@ -218,7 +218,7 @@ static void usb_msd_transfer_data(SCSIRequest *req, uint32_t arg) ...@@ -218,7 +218,7 @@ static void usb_msd_transfer_data(SCSIRequest *req, uint32_t arg)
} }
assert((s->mode == USB_MSDM_DATAOUT) == (req->cmd.mode == SCSI_XFER_TO_DEV)); assert((s->mode == USB_MSDM_DATAOUT) == (req->cmd.mode == SCSI_XFER_TO_DEV));
s->scsi_len = arg; s->scsi_len = len;
s->scsi_buf = scsi_req_get_buf(req); s->scsi_buf = scsi_req_get_buf(req);
if (p) { if (p) {
usb_msd_copy_data(s); usb_msd_copy_data(s);
...@@ -233,7 +233,7 @@ static void usb_msd_transfer_data(SCSIRequest *req, uint32_t arg) ...@@ -233,7 +233,7 @@ static void usb_msd_transfer_data(SCSIRequest *req, uint32_t arg)
} }
} }
static void usb_msd_command_complete(SCSIRequest *req, uint32_t arg) static void usb_msd_command_complete(SCSIRequest *req, uint32_t status)
{ {
MSDState *s = DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent); MSDState *s = DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent);
USBPacket *p = s->packet; USBPacket *p = s->packet;
...@@ -241,9 +241,9 @@ static void usb_msd_command_complete(SCSIRequest *req, uint32_t arg) ...@@ -241,9 +241,9 @@ static void usb_msd_command_complete(SCSIRequest *req, uint32_t arg)
if (req->tag != s->tag) { if (req->tag != s->tag) {
fprintf(stderr, "usb-msd: Unexpected SCSI Tag 0x%x\n", req->tag); fprintf(stderr, "usb-msd: Unexpected SCSI Tag 0x%x\n", req->tag);
} }
DPRINTF("Command complete %d\n", arg); DPRINTF("Command complete %d\n", status);
s->residue = s->data_len; s->residue = s->data_len;
s->result = arg != 0; s->result = status != 0;
if (s->packet) { if (s->packet) {
if (s->data_len == 0 && s->mode == USB_MSDM_DATAOUT) { if (s->data_len == 0 && s->mode == USB_MSDM_DATAOUT) {
/* A deferred packet with no write data remaining must be /* A deferred packet with no write data remaining must be
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册