diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2009-11-26 15:33:57 +0100 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2009-12-03 09:41:37 -0600 |
commit | 97a064356704af1756270b1d56dea2690ae015de (patch) | |
tree | aed2584678edddfd556232744688c1d22dc2adbf /hw/scsi-bus.c | |
parent | ebf460231276efe86ca75613e3cd4169956f7076 (diff) |
scsi: add xfer mode
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'hw/scsi-bus.c')
-rw-r--r-- | hw/scsi-bus.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/hw/scsi-bus.c b/hw/scsi-bus.c index 1580d600a7..e250e4f9d5 100644 --- a/hw/scsi-bus.c +++ b/hw/scsi-bus.c @@ -258,6 +258,51 @@ static int scsi_req_stream_length(SCSIRequest *req, uint8_t *cmd) return 0; } +static void scsi_req_xfer_mode(SCSIRequest *req) +{ + switch (req->cmd.buf[0]) { + case WRITE_6: + case WRITE_10: + case WRITE_VERIFY: + case WRITE_12: + case WRITE_VERIFY_12: + case COPY: + case COPY_VERIFY: + case COMPARE: + case CHANGE_DEFINITION: + case LOG_SELECT: + case MODE_SELECT: + case MODE_SELECT_10: + case SEND_DIAGNOSTIC: + case WRITE_BUFFER: + case FORMAT_UNIT: + case REASSIGN_BLOCKS: + case RESERVE: + case SEARCH_EQUAL: + case SEARCH_HIGH: + case SEARCH_LOW: + case UPDATE_BLOCK: + case WRITE_LONG: + case WRITE_SAME: + case SEARCH_HIGH_12: + case SEARCH_EQUAL_12: + case SEARCH_LOW_12: + case SET_WINDOW: + case MEDIUM_SCAN: + case SEND_VOLUME_TAG: + case WRITE_LONG_2: + req->cmd.mode = SCSI_XFER_TO_DEV; + break; + default: + if (req->cmd.xfer) + req->cmd.mode = SCSI_XFER_FROM_DEV; + else { + req->cmd.mode = SCSI_XFER_NONE; + } + break; + } +} + static uint64_t scsi_req_lba(SCSIRequest *req) { uint8_t *buf = req->cmd.buf; @@ -303,6 +348,7 @@ int scsi_req_parse(SCSIRequest *req, uint8_t *buf) return rc; memcpy(req->cmd.buf, buf, req->cmd.len); + scsi_req_xfer_mode(req); req->cmd.lba = scsi_req_lba(req); return 0; } |