diff mbox

[v2] scsi-disk: add some optional scsi commands

Message ID 4C84B38E.5080900@nsn.com
State New
Headers show

Commit Message

Bernhard Kohl Sept. 6, 2010, 9:25 a.m. UTC
I use a legacy OS which depends on some optional SCSI commands.
In fact this implementation does nothing special, but provides minimum
support for the following commands:

REZERO UNIT
WRITE AND VERIFY(10)
WRITE AND VERIFY(12)
WRITE AND VERIFY(16)
MODE SELECT(6)
MODE SELECT(10)
SEEK(6)
SEEK(10)

Signed-off-by: Bernhard Kohl <bernhard.kohl@nsn.com>
---
  hw/scsi-disk.c |   36 +++++++++++++++++++++++++++++++++++-
  1 files changed, 35 insertions(+), 1 deletions(-)

      }
@@ -1011,6 +1017,7 @@ static int32_t scsi_send_command(SCSIDevice *d, 
uint32_t tag,
      case SERVICE_ACTION_IN:
      case REPORT_LUNS:
      case VERIFY:
+    case REZERO_UNIT:
          rc = scsi_disk_emulate_command(&r->req, outbuf);
          if (rc > 0) {
              r->iov.iov_len = rc;
@@ -1034,13 +1041,40 @@ static int32_t scsi_send_command(SCSIDevice *d, 
uint32_t tag,
      case WRITE_10:
      case WRITE_12:
      case WRITE_16:
-        DPRINTF("Write (sector %" PRId64 ", count %d)\n", lba, len);
+    case WRITE_VERIFY:
+    case WRITE_VERIFY_12:
+    case WRITE_VERIFY_16:
+        DPRINTF("Write %s(sector %" PRId64 ", count %d)\n",
+                (command & 0xe) == 0xe ? "And Verify " : "", lba, len);
          if (lba > s->max_lba)
              goto illegal_lba;
          r->sector = lba * s->cluster_size;
          r->sector_count = len * s->cluster_size;
          is_write = 1;
          break;
+    case MODE_SELECT:
+        DPRINTF("Mode Select(6) (len %d)\n", len);
+        /* We don't support mode parameter changes.
+           Allow the mode parameter header + block descriptors only. */
+        if (len > 12) {
+            goto fail;
+        }
+        break;
+    case MODE_SELECT_10:
+        DPRINTF("Mode Select(10) (len %d)\n", len);
+        /* We don't support mode parameter changes.
+           Allow the mode parameter header + block descriptors only. */
+        if (len > 16) {
+            goto fail;
+        }
+        break;
+    case SEEK_6:
+    case SEEK_10:
+        DPRINTF("Seek(%d) (sector %" PRId64 ")\n", command == SEEK_6 ? 
6 : 10, lba);
+        if (lba > s->max_lba) {
+            goto illegal_lba;
+        }
+        break;
      default:
      DPRINTF("Unknown SCSI command (%2.2x)\n", buf[0]);
      fail:

Comments

Kevin Wolf Sept. 6, 2010, 9:33 a.m. UTC | #1
Am 06.09.2010 11:25, schrieb Bernhard Kohl:
> I use a legacy OS which depends on some optional SCSI commands.
> In fact this implementation does nothing special, but provides minimum
> support for the following commands:
> 
> REZERO UNIT
> WRITE AND VERIFY(10)
> WRITE AND VERIFY(12)
> WRITE AND VERIFY(16)
> MODE SELECT(6)
> MODE SELECT(10)
> SEEK(6)
> SEEK(10)
> 
> Signed-off-by: Bernhard Kohl <bernhard.kohl@nsn.com>
> ---
>   hw/scsi-disk.c |   36 +++++++++++++++++++++++++++++++++++-
>   1 files changed, 35 insertions(+), 1 deletions(-)
> 
> diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
> index b80c9bd..1446ca6 100644
> --- a/hw/scsi-disk.c
> +++ b/hw/scsi-disk.c
> @@ -892,6 +892,12 @@ static int scsi_disk_emulate_command(SCSIRequest 
> *req, uint8_t *outbuf)

Sorry to request another version, but this patch is corrupted by line
wraps. I think it was right when you sent the first version, did you
change anything?

Kevin
Bernhard Kohl Sept. 6, 2010, 9:41 a.m. UTC | #2
Am 06.09.2010 11:33, schrieb ext Kevin Wolf:
> Sorry to request another version, but this patch is corrupted by line
> wraps. I think it was right when you sent the first version, did you
> change anything?
>    

No I didn't change anything. I did 'git commit -s --amend' and
'git format-patch' and then I pasted it into Thunderbird. What
email program are you using?

The first version I sent with 'git send-email'. I'll try that again.

Bernhard
Kevin Wolf Sept. 6, 2010, 10:03 a.m. UTC | #3
Am 06.09.2010 11:41, schrieb Bernhard Kohl:
> Am 06.09.2010 11:33, schrieb ext Kevin Wolf:
>> Sorry to request another version, but this patch is corrupted by line
>> wraps. I think it was right when you sent the first version, did you
>> change anything?
>>    
> 
> No I didn't change anything. I did 'git commit -s --amend' and
> 'git format-patch' and then I pasted it into Thunderbird. What
> email program are you using?
> 
> The first version I sent with 'git send-email'. I'll try that again.

git send-email is what I use for patches, too. It hasn't broken my
patches so far and it's also quite convenient because it works from the
shell where I just ran git format-patch.

Kevin
diff mbox

Patch

diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
index b80c9bd..1446ca6 100644
--- a/hw/scsi-disk.c
+++ b/hw/scsi-disk.c
@@ -892,6 +892,12 @@  static int scsi_disk_emulate_command(SCSIRequest 
*req, uint8_t *outbuf)
          break;
      case VERIFY:
          break;
+    case REZERO_UNIT:
+        DPRINTF("Rezero Unit\n");
+        if (!bdrv_is_inserted(s->bs)) {
+            goto not_ready;
+        }
+        break;
      default:
          goto illegal_request;