Message ID | 4C84B38E.5080900@nsn.com |
---|---|
State | New |
Headers | show |
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
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
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 --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;
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: