From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:34424) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R62E2-0005b1-32 for qemu-devel@nongnu.org; Tue, 20 Sep 2011 11:27:14 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1R62Dx-0005SD-CS for qemu-devel@nongnu.org; Tue, 20 Sep 2011 11:27:09 -0400 Received: from mail-ww0-f53.google.com ([74.125.82.53]:40788) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R62Dx-0005PR-0U for qemu-devel@nongnu.org; Tue, 20 Sep 2011 11:27:05 -0400 Received: by mail-ww0-f53.google.com with SMTP id 14so804349wwg.10 for ; Tue, 20 Sep 2011 08:27:04 -0700 (PDT) Sender: Paolo Bonzini From: Paolo Bonzini Date: Tue, 20 Sep 2011 17:26:44 +0200 Message-Id: <1316532406-25340-11-git-send-email-pbonzini@redhat.com> In-Reply-To: <1316532406-25340-1-git-send-email-pbonzini@redhat.com> References: <1316532406-25340-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH 10/12] scsi-disk: support DVD profile in GET CONFIGURATION List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Signed-off-by: Paolo Bonzini --- hw/scsi-disk.c | 50 ++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 42 insertions(+), 8 deletions(-) diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c index 33bab8c..d6b5bfe 100644 --- a/hw/scsi-disk.c +++ b/hw/scsi-disk.c @@ -562,6 +562,19 @@ static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf) return buflen; } +static inline bool media_is_dvd(SCSIDiskState *s) +{ + uint64_t nb_sectors; + if (s->qdev.type != TYPE_ROM) { + return false; + } + if (!bdrv_is_inserted(s->bs)) { + return false; + } + bdrv_get_geometry(s->bs, &nb_sectors); + return nb_sectors > CD_MAX_SECTORS; +} + static int scsi_read_dvd_structure(SCSIDiskState *s, SCSIDiskReq *r, uint8_t *outbuf) { @@ -576,17 +589,38 @@ static int scsi_get_event_status_notification(SCSIDiskState *s, return -1; } -static int scsi_get_configuration(SCSIDiskState *s, SCSIDiskReq *r, - uint8_t *outbuf) +static int scsi_get_configuration(SCSIDiskState *s, uint8_t *outbuf) { + int current; + 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; + current = media_is_dvd(s) ? MMC_PROFILE_DVD_ROM : MMC_PROFILE_CD_ROM; + memset(outbuf, 0, 40); + stl_be_p(&outbuf[0], 36); /* Bytes after the data length field */ + /* outbuf[4] - outbuf[19]: Feature 0 - Profile list */ + stw_be_p(&outbuf[6], current); + outbuf[10] = 0x03; /* persistent, current */ + outbuf[11] = 8; /* two profiles */ + stw_be_p(&outbuf[12], MMC_PROFILE_DVD_ROM); + outbuf[14] = (current == MMC_PROFILE_DVD_ROM); + stw_be_p(&outbuf[16], MMC_PROFILE_CD_ROM); + outbuf[18] = (current == MMC_PROFILE_CD_ROM); + /* outbuf[20] - outbuf[31]: Feature 1 - Core feature */ + stw_be_p(&outbuf[20], 1); + outbuf[22] = 0x08 | 0x03; /* version 2, persistent, current */ + outbuf[23] = 8; + stl_be_p(&outbuf[24], 1); /* SCSI */ + outbuf[28] = 1; /* DBE = 1, mandatory */ + /* outbuf[32] - outbuf[39]: Feature 3 - Removable media feature */ + stw_be_p(&outbuf[32], 3); + outbuf[34] = 0x08 | 0x03; /* version 2, persistent, current */ + outbuf[35] = 4; + outbuf[36] = 0x39; /* tray, load=1, eject=1, unlocked at powerup, lock=1 */ + /* TODO: Random readable, CD read, DVD read, drive serial number, + power management */ + return 40; } static int scsi_emulate_mechanism_status(SCSIDiskState *s, uint8_t *outbuf) @@ -1005,7 +1039,7 @@ static int scsi_disk_emulate_command(SCSIDiskReq *r) goto illegal_request; break; case GET_CONFIGURATION: - buflen = scsi_get_configuration(s, r, outbuf); + buflen = scsi_get_configuration(s, outbuf); if (buflen < 0) goto illegal_request; break; -- 1.7.6