qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] Do you have a use for a tester of virtio-scsi with CD d


From: Thomas Schmitt
Subject: Re: [Qemu-devel] Do you have a use for a tester of virtio-scsi with CD drives ?
Date: Wed, 02 Nov 2011 22:22:23 +0100

Hi,

i wrote:
> > So how is this altered to 0x12 in the further course of processing ?

Paolo Bonzini wrote:
> Because you're using an *IDE* (ATAPI) CD-ROM, not SCSI.  See hw/ide/atapi.c.

You convinced me.
But this does not explain yet the difference in behavior of
both groups of IDE DVD-ROMs. Why are those of -drive if=scsi empty ?


> Ok, in your counting I should have written 20 for IDE (0x12 + page number +
> page size) and 22 for SCSI (0x14 + page number + page size).

Why the distinction by transport bus ? Mode page 2Ah is a matter
of the drive alone. MMC is independent of the bus.

MMC-1 prescribes Page Length 0x14 = 20.
This counts the bytes after byte 1 of the mode page.
So the page size is 22 bytes.
The last byte is the LSB of Current Write Speed (MMC-1 table 103).

SPC-1 prescribes to prefix the result of MODE SENSE(10) with 8 bytes
of Mode Parameter Header.
The first two are MSB and LSB of Mode Data Length.
  Mode Data Length = 8 + Page Length = 28 = 0x1c
The total size of the reply should be 30 bytes.
Like
  00 1c xx xx xx xx xx xx 2a 14 xx ... up to 30 bytes ...
 
The history of mode page 2Ah is colorful.
In MMC-2, the mode page has 26 bytes rather than 22.
In MMC-3, the length is variable. At least 32 bytes, with the
number of 4-byte write speed descriptors in bytes 30 and 31.
In MMC-4 to MMC-6 it is only briefly mentioned as legacy feature.

Since all MMC drivers have to be aware of MMC-1 compliant drives,
it is well ok to stay with MMC-1, although DVD drives appear first
in MMC-2.

So i would propose to replace 28 by 30, and set buf[28], buf[29] to 0
in hw/ide/atapi.c , cmd_mode_sense() , case MODE_PAGE_CAPABILITIES

I tried to check whether buf[] is large enough in the callers.
With some fgrepping i finally end up in hw/ide/core.c:ide_init1()
    s->io_buffer_total_len = IDE_DMA_BUF_SECTORS*512 + 4;
    s->io_buffer = qemu_memalign(2048, s->io_buffer_total_len);
So roughly this should be ok ... if qemu_memalign() has the job to
allocate at least s->io_buffer_total_len bytes.

I did not yet find out, why the IDE drive emulation emits a Mode Data
Length of 0x22. With Page Length 0x12 it should have been 0x1a.
8 too many.


Have a nice day :)

Thomas




reply via email to

[Prev in Thread] Current Thread [Next in Thread]