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 <pbonz...@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

Reply via email to