SCSI: STARTSTOPUNIT only eject/load media if powercondition is 0

Submitted by ronniesahlberg@gmail.com on July 28, 2012, 1:14 a.m.

Details

Message ID 1343438093-13151-2-git-send-email-ronniesahlberg@gmail.com
State New
Headers show

Commit Message

ronniesahlberg@gmail.com July 28, 2012, 1:14 a.m.
The START STOP UNIT command will only eject/load media if
power condition is zero.

If power condition is !0 then LOEJ and START will be ignored.

From MMC (sbc contains similar wordings too)
  The Power Conditions field requests the block device to be placed
  in the power condition defined in
  Table 558. If this field has a value other than 0h then the Start
  and LoEj bits shall be ignored.

Signed-off-by: Ronnie Sahlberg <ronniesahlberg@gmail.com>
---
 hw/scsi-disk.c |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)

Comments

Paolo Bonzini July 30, 2012, 7:42 a.m.
Il 28/07/2012 03:14, Ronnie Sahlberg ha scritto:
> The START STOP UNIT command will only eject/load media if
> power condition is zero.
> 
> If power condition is !0 then LOEJ and START will be ignored.
> 
> From MMC (sbc contains similar wordings too)
>   The Power Conditions field requests the block device to be placed
>   in the power condition defined in
>   Table 558. If this field has a value other than 0h then the Start
>   and LoEj bits shall be ignored.
> 
> Signed-off-by: Ronnie Sahlberg <ronniesahlberg@gmail.com>

Applied, thanks.

Paolo
Kevin Wolf July 30, 2012, 8:20 a.m.
Am 28.07.2012 03:14, schrieb Ronnie Sahlberg:
> The START STOP UNIT command will only eject/load media if
> power condition is zero.
> 
> If power condition is !0 then LOEJ and START will be ignored.
> 
> From MMC (sbc contains similar wordings too)
>   The Power Conditions field requests the block device to be placed
>   in the power condition defined in
>   Table 558. If this field has a value other than 0h then the Start
>   and LoEj bits shall be ignored.
> 
> Signed-off-by: Ronnie Sahlberg <ronniesahlberg@gmail.com>

Does ATAPI need the same?

Kevin
Paolo Bonzini July 30, 2012, 8:25 a.m.
Il 30/07/2012 10:20, Kevin Wolf ha scritto:
> Am 28.07.2012 03:14, schrieb Ronnie Sahlberg:
>> > The START STOP UNIT command will only eject/load media if
>> > power condition is zero.
>> > 
>> > If power condition is !0 then LOEJ and START will be ignored.
>> > 
>> > From MMC (sbc contains similar wordings too)
>> >   The Power Conditions field requests the block device to be placed
>> >   in the power condition defined in
>> >   Table 558. If this field has a value other than 0h then the Start
>> >   and LoEj bits shall be ignored.
>> > 
>> > Signed-off-by: Ronnie Sahlberg <ronniesahlberg@gmail.com>
> Does ATAPI need the same?

Yes, I already asked Ronnie to redo these two patches for ATAPI as well.

Paolo
ronniesahlberg@gmail.com July 30, 2012, 8:46 a.m.
I will create a patch for ATAPI for this.

On Mon, Jul 30, 2012 at 6:20 PM, Kevin Wolf <kwolf@redhat.com> wrote:
> Am 28.07.2012 03:14, schrieb Ronnie Sahlberg:
>> The START STOP UNIT command will only eject/load media if
>> power condition is zero.
>>
>> If power condition is !0 then LOEJ and START will be ignored.
>>
>> From MMC (sbc contains similar wordings too)
>>   The Power Conditions field requests the block device to be placed
>>   in the power condition defined in
>>   Table 558. If this field has a value other than 0h then the Start
>>   and LoEj bits shall be ignored.
>>
>> Signed-off-by: Ronnie Sahlberg <ronniesahlberg@gmail.com>
>
> Does ATAPI need the same?
>
> Kevin

Patch hide | download patch | download mbox

diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
index 525816c..5426990 100644
--- a/hw/scsi-disk.c
+++ b/hw/scsi-disk.c
@@ -1244,6 +1244,12 @@  static int scsi_disk_emulate_start_stop(SCSIDiskReq *r)
     SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
     bool start = req->cmd.buf[4] & 1;
     bool loej = req->cmd.buf[4] & 2; /* load on start, eject on !start */
+    int pwrcnd = req->cmd.buf[4] & 0xf0;
+
+    if (pwrcnd) {
+        /* eject/load only happens for power condition == 0 */
+        return 0;
+    }
 
     if (s->qdev.type == TYPE_ROM && loej) {
         if (!start && !s->tray_open && s->tray_locked) {