qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 12/15] scsi: move sense to SCSIDevice, create SCSISe


From: Gerd Hoffmann
Subject: [Qemu-devel] [PATCH 12/15] scsi: move sense to SCSIDevice, create SCSISense struct.
Date: Tue, 17 Nov 2009 11:17:48 +0100

Signed-off-by: Gerd Hoffmann <address@hidden>
---
 hw/scsi-bus.c  |   10 ++++++++++
 hw/scsi-disk.c |    8 ++++----
 hw/scsi.h      |    8 ++++++++
 3 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/hw/scsi-bus.c b/hw/scsi-bus.c
index 77409de..493e220 100644
--- a/hw/scsi-bus.c
+++ b/hw/scsi-bus.c
@@ -113,6 +113,16 @@ void scsi_bus_legacy_handle_cmdline(SCSIBus *bus)
     }
 }
 
+void scsi_dev_clear_sense(SCSIDevice *dev)
+{
+    memset(&dev->sense, 0, sizeof(dev->sense));
+}
+
+void scsi_dev_set_sense(SCSIDevice *dev, uint8_t key)
+{
+    dev->sense.key = key;
+}
+
 void scsi_req_init(SCSIRequest *req, SCSIDevice *d, uint32_t tag, uint32_t lun)
 {
     req->bus = scsi_bus_from_device(d);
diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
index 2068187..c0c407b 100644
--- a/hw/scsi-disk.c
+++ b/hw/scsi-disk.c
@@ -59,7 +59,6 @@ struct SCSIDiskState
        This is the number of 512 byte blocks in a single scsi sector.  */
     int cluster_size;
     uint64_t max_lba;
-    int sense;
     char drive_serial_str[21];
     QEMUBH *bh;
 };
@@ -112,7 +111,7 @@ static void scsi_command_complete(SCSIDiskReq *r, int 
status, int sense)
     uint32_t tag;
     DPRINTF("Command complete tag=0x%x status=%d sense=%d\n",
             r->req.tag, status, sense);
-    s->sense = sense;
+    scsi_dev_set_sense(&s->qdev, sense);
     tag = r->req.tag;
     scsi_remove_request(r);
     r->req.bus->complete(r->req.bus, SCSI_REASON_DONE, tag, status);
@@ -413,7 +412,7 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t 
tag,
             goto fail;
         memset(outbuf, 0, 4);
         r->iov.iov_len = 4;
-        if (s->sense == NOT_READY && len >= 18) {
+        if (s->qdev.sense.key == NOT_READY && len >= 18) {
             memset(outbuf, 0, 18);
             r->iov.iov_len = 18;
             outbuf[7] = 10;
@@ -423,7 +422,8 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t 
tag,
         }
         outbuf[0] = 0xf0;
         outbuf[1] = 0;
-        outbuf[2] = s->sense;
+        outbuf[2] = s->qdev.sense.key;
+        scsi_dev_clear_sense(&s->qdev);
         break;
     case INQUIRY:
         DPRINTF("Inquiry (len %d)\n", len);
diff --git a/hw/scsi.h b/hw/scsi.h
index f2d033f..bdba1db 100644
--- a/hw/scsi.h
+++ b/hw/scsi.h
@@ -24,6 +24,10 @@ enum SCSIXferMode {
     SCSI_XFER_TO_DEV,    /*  WRITE, MODE_SELECT, ...         */
 };
 
+typedef struct SCSISense {
+    uint8_t key;
+} SCSISense;
+
 typedef struct SCSIRequest {
     SCSIBus           *bus;
     SCSIDevice        *dev;
@@ -48,6 +52,7 @@ struct SCSIDevice
     QTAILQ_HEAD(, SCSIRequest) requests;
     int blocksize;
     int type;
+    struct SCSISense sense;
 };
 
 /* cdrom.c */
@@ -92,6 +97,9 @@ static inline SCSIBus *scsi_bus_from_device(SCSIDevice *d)
 SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, DriveInfo *dinfo, int 
unit);
 void scsi_bus_legacy_handle_cmdline(SCSIBus *bus);
 
+void scsi_dev_clear_sense(SCSIDevice *dev);
+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);
 
-- 
1.6.2.5





reply via email to

[Prev in Thread] Current Thread [Next in Thread]