[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 14/15] scsi: move status to SCSIRequest.
From: |
Gerd Hoffmann |
Subject: |
[Qemu-devel] [PATCH 14/15] scsi: move status to SCSIRequest. |
Date: |
Tue, 17 Nov 2009 11:17:50 +0100 |
Also add and use the scsi_req_complete() helper function for calling the
completion callback.
Signed-off-by: Gerd Hoffmann <address@hidden>
---
hw/scsi-bus.c | 9 +++++++++
hw/scsi-disk.c | 13 ++++++++-----
hw/scsi-generic.c | 18 ++++++++----------
hw/scsi.h | 2 ++
4 files changed, 27 insertions(+), 15 deletions(-)
diff --git a/hw/scsi-bus.c b/hw/scsi-bus.c
index 493e220..edfe099 100644
--- a/hw/scsi-bus.c
+++ b/hw/scsi-bus.c
@@ -131,6 +131,7 @@ void scsi_req_init(SCSIRequest *req, SCSIDevice *d,
uint32_t tag, uint32_t lun)
req->lun = lun;
req->aiocb = NULL;
memset(&req->cmd, 0, sizeof(req->cmd));
+ req->status = -1;
}
static int scsi_req_length(SCSIRequest *req, uint8_t *cmd)
@@ -341,3 +342,11 @@ int scsi_req_parse(SCSIRequest *req, uint8_t *buf)
req->cmd.lba = scsi_req_lba(req);
return 0;
}
+
+void scsi_req_complete(SCSIRequest *req)
+{
+ assert(req->status != -1);
+ req->bus->complete(req->bus, SCSI_REASON_DONE,
+ req->tag,
+ req->status);
+}
diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
index e072226..bc0fc31 100644
--- a/hw/scsi-disk.c
+++ b/hw/scsi-disk.c
@@ -103,17 +103,20 @@ static SCSIDiskReq *scsi_find_request(SCSIDiskState *s,
uint32_t tag)
return NULL;
}
+static void scsi_req_set_status(SCSIRequest *req, int status, int sense_code)
+{
+ req->status = status;
+ scsi_dev_set_sense(req->dev, sense_code);
+}
+
/* Helper function for command completion. */
static void scsi_command_complete(SCSIDiskReq *r, int status, int sense)
{
- SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
- uint32_t tag;
DPRINTF("Command complete tag=0x%x status=%d sense=%d\n",
r->req.tag, status, sense);
- scsi_dev_set_sense(&s->qdev, sense);
- tag = r->req.tag;
+ scsi_req_set_status(&r->req, status, sense);
+ scsi_req_complete(&r->req);
scsi_remove_request(r);
- r->req.bus->complete(r->req.bus, SCSI_REASON_DONE, tag, status);
}
/* Cancel a pending data transfer. */
diff --git a/hw/scsi-generic.c b/hw/scsi-generic.c
index 150bd93..557b833 100644
--- a/hw/scsi-generic.c
+++ b/hw/scsi-generic.c
@@ -110,31 +110,29 @@ static void scsi_command_complete(void *opaque, int ret)
{
SCSIGenericReq *r = (SCSIGenericReq *)opaque;
SCSIGenericState *s = DO_UPCAST(SCSIGenericState, qdev, r->req.dev);
- uint32_t tag;
- int status;
s->driver_status = r->io_header.driver_status;
if (s->driver_status & SG_ERR_DRIVER_SENSE)
s->senselen = r->io_header.sb_len_wr;
if (ret != 0)
- status = BUSY << 1;
+ r->req.status = BUSY << 1;
else {
if (s->driver_status & SG_ERR_DRIVER_TIMEOUT) {
- status = BUSY << 1;
+ r->req.status = BUSY << 1;
BADF("Driver Timeout\n");
} else if (r->io_header.status)
- status = r->io_header.status;
+ r->req.status = r->io_header.status;
else if (s->driver_status & SG_ERR_DRIVER_SENSE)
- status = CHECK_CONDITION << 1;
+ r->req.status = CHECK_CONDITION << 1;
else
- status = GOOD << 1;
+ r->req.status = GOOD << 1;
}
DPRINTF("Command complete 0x%p tag=0x%x status=%d\n",
- r, r->req.tag, status);
- tag = r->req.tag;
+ r, r->req.tag, r->req.status);
+
+ scsi_req_complete(&r->req);
scsi_remove_request(r);
- r->req.bus->complete(r->req.bus, SCSI_REASON_DONE, tag, status);
}
/* Cancel a pending data transfer. */
diff --git a/hw/scsi.h b/hw/scsi.h
index cb85864..370932b 100644
--- a/hw/scsi.h
+++ b/hw/scsi.h
@@ -33,6 +33,7 @@ typedef struct SCSIRequest {
SCSIDevice *dev;
uint32_t tag;
uint32_t lun;
+ uint32_t status;
struct {
uint8_t buf[SCSI_CMD_BUF_SIZE];
int len;
@@ -103,5 +104,6 @@ void scsi_dev_set_sense(SCSIDevice *dev, uint8_t key);
void scsi_req_init(SCSIRequest *req, SCSIDevice *d, uint32_t tag, uint32_t
lun);
int scsi_req_parse(SCSIRequest *req, uint8_t *buf);
+void scsi_req_complete(SCSIRequest *req);
#endif
--
1.6.2.5
- [Qemu-devel] [PATCH 12/15] scsi: move sense to SCSIDevice, create SCSISense struct., (continued)
[Qemu-devel] [PATCH 10/15] scsi: use command defines in scsi-disk.c, Gerd Hoffmann, 2009/11/17
[Qemu-devel] [PATCH 14/15] scsi: move status to SCSIRequest.,
Gerd Hoffmann <=
[Qemu-devel] [PATCH 15/15] scsi: add scsi_req_print(), Gerd Hoffmann, 2009/11/17
[Qemu-devel] [PATCH 07/15] scsi: add scsi-defs.h, Gerd Hoffmann, 2009/11/17
[Qemu-devel] [PATCH 13/15] scsi: move dinfo to SCSIDevice, Gerd Hoffmann, 2009/11/17
[Qemu-devel] [PATCH 11/15] scsi: add xfer mode, Gerd Hoffmann, 2009/11/17