diff mbox

[07/35] scsi-disk: add stubs for more MMC commands

Message ID 1318503845-11473-8-git-send-email-pbonzini@redhat.com
State New
Headers show

Commit Message

Paolo Bonzini Oct. 13, 2011, 11:03 a.m. UTC
This patch adds a few stub implementations for MMC commands to
scsi-disk, to be filled in later in the series.  It also adds to
scsi-defs.h constants for commands implemented by ide/atapi.c,
when missing.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 hw/scsi-defs.h |    3 ++
 hw/scsi-disk.c |   63 +++++++++++++++++++++++++++++++++++++++++++++++++++----
 2 files changed, 61 insertions(+), 5 deletions(-)

Comments

Kevin Wolf Oct. 17, 2011, 2:27 p.m. UTC | #1
Am 13.10.2011 13:03, schrieb Paolo Bonzini:
> This patch adds a few stub implementations for MMC commands to
> scsi-disk, to be filled in later in the series.  It also adds to
> scsi-defs.h constants for commands implemented by ide/atapi.c,
> when missing.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  hw/scsi-defs.h |    3 ++
>  hw/scsi-disk.c |   63 +++++++++++++++++++++++++++++++++++++++++++++++++++----
>  2 files changed, 61 insertions(+), 5 deletions(-)
> 
> diff --git a/hw/scsi-defs.h b/hw/scsi-defs.h
> index 8094698..030d4c2 100644
> --- a/hw/scsi-defs.h
> +++ b/hw/scsi-defs.h
> @@ -113,6 +113,7 @@
>  #define READ_12               0xa8
>  #define WRITE_12              0xaa
>  #define SERVICE_ACTION_IN_12  0xab
> +#define READ_DVD_STRUCTURE    0xad
>  #define WRITE_VERIFY_12       0xae
>  #define VERIFY_12             0xaf
>  #define SEARCH_HIGH_12        0xb0
> @@ -122,6 +123,8 @@
>  #define SEND_VOLUME_TAG       0xb6
>  #define READ_DEFECT_DATA_12   0xb7
>  #define SET_CD_SPEED          0xbb
> +#define MECHANISM_STATUS      0xbd
> +#define READ_CD               0xbe
>  
>  /*
>   * SERVICE ACTION IN subcodes
> diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
> index 880cb22..95a6b77 100644
> --- a/hw/scsi-disk.c
> +++ b/hw/scsi-disk.c
> @@ -563,6 +563,43 @@ static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf)
>      return buflen;
>  }
>  
> +static int scsi_read_dvd_structure(SCSIDiskState *s, SCSIDiskReq *r,
> +                                   uint8_t *outbuf)
> +{
> +    scsi_check_condition(r, SENSE_CODE(INVALID_OPCODE));
> +    return -1;
> +}
> +
> +static int scsi_get_event_status_notification(SCSIDiskState *s,
> +                                              SCSIDiskReq *r, uint8_t *outbuf)
> +{
> +    scsi_check_condition(r, SENSE_CODE(INVALID_OPCODE));
> +    return -1;
> +}
> +
> +static int scsi_get_configuration(SCSIDiskState *s, SCSIDiskReq *r,
> +                                  uint8_t *outbuf)
> +{
> +    if (s->qdev.type != TYPE_ROM) {
> +        return -1;
> +    }
> +    memset(outbuf, 0, 8);
> +    /* ??? This should probably return much more information.  For now
> +       just return the basic header indicating the CD-ROM profile.  */
> +    outbuf[7] = 8; // CD-ROM
> +    return 8;
> +}
> +
> +static int scsi_emulate_mechanism_status(SCSIDiskState *s, uint8_t *outbuf)
> +{
> +    if (s->qdev.type != TYPE_ROM) {
> +        return -1;
> +    }
> +    memset(outbuf, 0, 8);
> +    outbuf[5] = 1; // CD-ROM
> +    return 8;
> +}
> +
>  static int mode_sense_page(SCSIDiskState *s, int page, uint8_t **p_outbuf,
>                             int page_control)
>  {
> @@ -947,12 +984,25 @@ static int scsi_disk_emulate_command(SCSIDiskReq *r)
>          outbuf[7] = 0;
>          buflen = 8;
>          break;
> +    case MECHANISM_STATUS:
> +        buflen = scsi_emulate_mechanism_status(s, outbuf);
> +        if (buflen < 0)
> +            goto illegal_request;

Braces are missing here and in the other commands.

Kevin
Paolo Bonzini Oct. 17, 2011, 2:28 p.m. UTC | #2
On 10/17/2011 04:27 PM, Kevin Wolf wrote:
> Braces are missing here and in the other commands.

Yes, but that's consistent with the rest of scsi-disk.  I'll try to add 
them and see how bad the conflicts are.

Paolo
diff mbox

Patch

diff --git a/hw/scsi-defs.h b/hw/scsi-defs.h
index 8094698..030d4c2 100644
--- a/hw/scsi-defs.h
+++ b/hw/scsi-defs.h
@@ -113,6 +113,7 @@ 
 #define READ_12               0xa8
 #define WRITE_12              0xaa
 #define SERVICE_ACTION_IN_12  0xab
+#define READ_DVD_STRUCTURE    0xad
 #define WRITE_VERIFY_12       0xae
 #define VERIFY_12             0xaf
 #define SEARCH_HIGH_12        0xb0
@@ -122,6 +123,8 @@ 
 #define SEND_VOLUME_TAG       0xb6
 #define READ_DEFECT_DATA_12   0xb7
 #define SET_CD_SPEED          0xbb
+#define MECHANISM_STATUS      0xbd
+#define READ_CD               0xbe
 
 /*
  * SERVICE ACTION IN subcodes
diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
index 880cb22..95a6b77 100644
--- a/hw/scsi-disk.c
+++ b/hw/scsi-disk.c
@@ -563,6 +563,43 @@  static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf)
     return buflen;
 }
 
+static int scsi_read_dvd_structure(SCSIDiskState *s, SCSIDiskReq *r,
+                                   uint8_t *outbuf)
+{
+    scsi_check_condition(r, SENSE_CODE(INVALID_OPCODE));
+    return -1;
+}
+
+static int scsi_get_event_status_notification(SCSIDiskState *s,
+                                              SCSIDiskReq *r, uint8_t *outbuf)
+{
+    scsi_check_condition(r, SENSE_CODE(INVALID_OPCODE));
+    return -1;
+}
+
+static int scsi_get_configuration(SCSIDiskState *s, SCSIDiskReq *r,
+                                  uint8_t *outbuf)
+{
+    if (s->qdev.type != TYPE_ROM) {
+        return -1;
+    }
+    memset(outbuf, 0, 8);
+    /* ??? This should probably return much more information.  For now
+       just return the basic header indicating the CD-ROM profile.  */
+    outbuf[7] = 8; // CD-ROM
+    return 8;
+}
+
+static int scsi_emulate_mechanism_status(SCSIDiskState *s, uint8_t *outbuf)
+{
+    if (s->qdev.type != TYPE_ROM) {
+        return -1;
+    }
+    memset(outbuf, 0, 8);
+    outbuf[5] = 1; // CD-ROM
+    return 8;
+}
+
 static int mode_sense_page(SCSIDiskState *s, int page, uint8_t **p_outbuf,
                            int page_control)
 {
@@ -947,12 +984,25 @@  static int scsi_disk_emulate_command(SCSIDiskReq *r)
         outbuf[7] = 0;
         buflen = 8;
         break;
+    case MECHANISM_STATUS:
+        buflen = scsi_emulate_mechanism_status(s, outbuf);
+        if (buflen < 0)
+            goto illegal_request;
+        break;
     case GET_CONFIGURATION:
-        memset(outbuf, 0, 8);
-        /* ??? This should probably return much more information.  For now
-           just return the basic header indicating the CD-ROM profile.  */
-        outbuf[7] = 8; // CD-ROM
-        buflen = 8;
+        buflen = scsi_get_configuration(s, r, outbuf);
+        if (buflen < 0)
+            goto illegal_request;
+        break;
+    case GET_EVENT_STATUS_NOTIFICATION:
+        buflen = scsi_get_event_status_notification(s, r, outbuf);
+        if (buflen < 0)
+            goto illegal_request;
+        break;
+    case READ_DVD_STRUCTURE:
+        buflen = scsi_read_dvd_structure(s, r, outbuf);
+        if (buflen < 0)
+            goto illegal_request;
         break;
     case SERVICE_ACTION_IN_16:
         /* Service Action In subcommands. */
@@ -1055,7 +1105,10 @@  static int32_t scsi_send_command(SCSIRequest *req, uint8_t *buf)
     case ALLOW_MEDIUM_REMOVAL:
     case READ_CAPACITY_10:
     case READ_TOC:
+    case READ_DVD_STRUCTURE:
     case GET_CONFIGURATION:
+    case GET_EVENT_STATUS_NOTIFICATION:
+    case MECHANISM_STATUS:
     case SERVICE_ACTION_IN_16:
     case VERIFY_10:
         rc = scsi_disk_emulate_command(r);