mirror of https://github.com/xemu-project/xemu.git
scsi: small refactoring of MMC mode-sense
Make DBD a boolean value, and force device-specific parameter to zero. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
ac66842646
commit
e590ecbed5
|
@ -1080,11 +1080,12 @@ static int scsi_disk_emulate_mode_sense(SCSIDiskReq *r, uint8_t *outbuf)
|
||||||
{
|
{
|
||||||
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
|
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
|
||||||
uint64_t nb_sectors;
|
uint64_t nb_sectors;
|
||||||
int page, dbd, buflen, ret, page_control;
|
bool dbd;
|
||||||
|
int page, buflen, ret, page_control;
|
||||||
uint8_t *p;
|
uint8_t *p;
|
||||||
uint8_t dev_specific_param;
|
uint8_t dev_specific_param;
|
||||||
|
|
||||||
dbd = r->req.cmd.buf[1] & 0x8;
|
dbd = (r->req.cmd.buf[1] & 0x8) != 0;
|
||||||
page = r->req.cmd.buf[2] & 0x3f;
|
page = r->req.cmd.buf[2] & 0x3f;
|
||||||
page_control = (r->req.cmd.buf[2] & 0xc0) >> 6;
|
page_control = (r->req.cmd.buf[2] & 0xc0) >> 6;
|
||||||
DPRINTF("Mode Sense(%d) (page %d, xfer %zd, page_control %d)\n",
|
DPRINTF("Mode Sense(%d) (page %d, xfer %zd, page_control %d)\n",
|
||||||
|
@ -1092,10 +1093,15 @@ static int scsi_disk_emulate_mode_sense(SCSIDiskReq *r, uint8_t *outbuf)
|
||||||
memset(outbuf, 0, r->req.cmd.xfer);
|
memset(outbuf, 0, r->req.cmd.xfer);
|
||||||
p = outbuf;
|
p = outbuf;
|
||||||
|
|
||||||
if (bdrv_is_read_only(s->qdev.conf.bs)) {
|
dev_specific_param = 0x00;
|
||||||
dev_specific_param = 0x80; /* Readonly. */
|
if (s->qdev.type == TYPE_DISK) {
|
||||||
|
if (bdrv_is_read_only(s->qdev.conf.bs)) {
|
||||||
|
dev_specific_param |= 0x80; /* Readonly. */
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
dev_specific_param = 0x00;
|
/* MMC prescribes that CD/DVD drives have no block descriptors,
|
||||||
|
* and defines no device-specific parameter. */
|
||||||
|
dbd = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (r->req.cmd.buf[0] == MODE_SENSE) {
|
if (r->req.cmd.buf[0] == MODE_SENSE) {
|
||||||
|
@ -1110,9 +1116,8 @@ static int scsi_disk_emulate_mode_sense(SCSIDiskReq *r, uint8_t *outbuf)
|
||||||
p += 8;
|
p += 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* MMC prescribes that CD/DVD drives have no block descriptors. */
|
|
||||||
bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
|
bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
|
||||||
if (!dbd && s->qdev.type == TYPE_DISK && nb_sectors) {
|
if (!dbd && nb_sectors) {
|
||||||
if (r->req.cmd.buf[0] == MODE_SENSE) {
|
if (r->req.cmd.buf[0] == MODE_SENSE) {
|
||||||
outbuf[3] = 8; /* Block descriptor length */
|
outbuf[3] = 8; /* Block descriptor length */
|
||||||
} else { /* MODE_SENSE_10 */
|
} else { /* MODE_SENSE_10 */
|
||||||
|
|
Loading…
Reference in New Issue