Patchwork [12/30] scsi: move sense to SCSIDevice, create SCSISense struct.

login
register
mail settings
Submitter Gerd Hoffmann
Date Nov. 26, 2009, 2:33 p.m.
Message ID <1259246056-5389-13-git-send-email-kraxel@redhat.com>
Download mbox | patch
Permalink /patch/39530/
State New
Headers show

Comments

Gerd Hoffmann - Nov. 26, 2009, 2:33 p.m.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/scsi-bus.c  |   10 ++++++++++
 hw/scsi-disk.c |    8 ++++----
 hw/scsi.h      |    9 +++++++++
 3 files changed, 23 insertions(+), 4 deletions(-)

Patch

diff --git a/hw/scsi-bus.c b/hw/scsi-bus.c
index e250e4f..666ca3c 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;
+}
+
 SCSIRequest *scsi_req_alloc(size_t size, SCSIDevice *d, uint32_t tag, uint32_t lun)
 {
     SCSIRequest *req;
diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
index 4e92910..2eac400 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;
 };
@@ -93,7 +92,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;
     r->req.bus->complete(r->req.bus, SCSI_REASON_DONE, tag, status);
     scsi_remove_request(r);
@@ -394,7 +393,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;
@@ -404,7 +403,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 c5b30b8..f0aaed5 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,9 +97,13 @@  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);
+
 SCSIRequest *scsi_req_alloc(size_t size, SCSIDevice *d, uint32_t tag, uint32_t lun);
 SCSIRequest *scsi_req_find(SCSIDevice *d, uint32_t tag);
 void scsi_req_free(SCSIRequest *req);
+
 int scsi_req_parse(SCSIRequest *req, uint8_t *buf);
 
 #endif