Message ID | 1318503845-11473-8-git-send-email-pbonzini@redhat.com |
---|---|
State | New |
Headers | show |
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
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 --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);
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(-)