From patchwork Thu Nov 26 14:33:57 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gerd Hoffmann X-Patchwork-Id: 39533 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 16FBE1007DE for ; Fri, 27 Nov 2009 02:24:39 +1100 (EST) Received: from localhost ([127.0.0.1]:53475 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NDgCy-0007fV-Bh for incoming@patchwork.ozlabs.org; Thu, 26 Nov 2009 10:24:36 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NDfR1-0006r7-HL for qemu-devel@nongnu.org; Thu, 26 Nov 2009 09:35:04 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NDfQs-0006jS-7z for qemu-devel@nongnu.org; Thu, 26 Nov 2009 09:34:58 -0500 Received: from [199.232.76.173] (port=56163 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NDfQp-0006iN-SP for qemu-devel@nongnu.org; Thu, 26 Nov 2009 09:34:52 -0500 Received: from mx1.redhat.com ([209.132.183.28]:23379) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NDfQp-0000GN-Da for qemu-devel@nongnu.org; Thu, 26 Nov 2009 09:34:51 -0500 Received: from int-mx08.intmail.prod.int.phx2.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id nAQEYovZ024883 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 26 Nov 2009 09:34:50 -0500 Received: from zweiblum.home.kraxel.org (vpn2-8-164.ams2.redhat.com [10.36.8.164]) by int-mx08.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with SMTP id nAQEYd5M001305; Thu, 26 Nov 2009 09:34:42 -0500 Received: by zweiblum.home.kraxel.org (Postfix, from userid 500) id 2BDE67010F; Thu, 26 Nov 2009 15:34:18 +0100 (CET) From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Thu, 26 Nov 2009 15:33:57 +0100 Message-Id: <1259246056-5389-12-git-send-email-kraxel@redhat.com> In-Reply-To: <1259246056-5389-1-git-send-email-kraxel@redhat.com> References: <1259246056-5389-1-git-send-email-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.21 X-detected-operating-system: by monty-python.gnu.org: Genre and OS details not recognized. Cc: Gerd Hoffmann Subject: [Qemu-devel] [PATCH 11/30] scsi: add xfer mode X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Signed-off-by: Gerd Hoffmann --- hw/scsi-bus.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ hw/scsi-generic.c | 40 +--------------------------------------- hw/scsi.h | 7 +++++++ 3 files changed, 54 insertions(+), 39 deletions(-) diff --git a/hw/scsi-bus.c b/hw/scsi-bus.c index 1580d60..e250e4f 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; } diff --git a/hw/scsi-generic.c b/hw/scsi-generic.c index 3c7feac..38fb46a 100644 --- a/hw/scsi-generic.c +++ b/hw/scsi-generic.c @@ -307,44 +307,6 @@ static void scsi_req_fixup(SCSIRequest *req) } } -static int is_write(int command) -{ - switch (command) { - 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 WRITE_6: - case WRITE_10: - case WRITE_VERIFY: - case UPDATE_BLOCK: - case WRITE_LONG: - case WRITE_SAME: - case SEARCH_HIGH_12: - case SEARCH_EQUAL_12: - case SEARCH_LOW_12: - case WRITE_12: - case WRITE_VERIFY_12: - case SET_WINDOW: - case MEDIUM_SCAN: - case SEND_VOLUME_TAG: - case WRITE_LONG_2: - return 1; - } - return 0; -} - /* Execute a scsi command. Returns the length of the data expected by the command. This will be Positive for data transfers from the device (eg. disk reads), negative for transfers to the device (eg. disk writes), @@ -415,7 +377,7 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, memset(r->buf, 0, r->buflen); r->len = r->req.cmd.xfer; - if (is_write(cmd[0])) { + if (r->req.cmd.mode == SCSI_XFER_TO_DEV) { r->len = 0; return -r->req.cmd.xfer; } diff --git a/hw/scsi.h b/hw/scsi.h index 8c64067..c5b30b8 100644 --- a/hw/scsi.h +++ b/hw/scsi.h @@ -18,6 +18,12 @@ typedef struct SCSIDeviceInfo SCSIDeviceInfo; typedef void (*scsi_completionfn)(SCSIBus *bus, int reason, uint32_t tag, uint32_t arg); +enum SCSIXferMode { + SCSI_XFER_NONE, /* TEST_UNIT_READY, ... */ + SCSI_XFER_FROM_DEV, /* READ, INQUIRY, MODE_SENSE, ... */ + SCSI_XFER_TO_DEV, /* WRITE, MODE_SELECT, ... */ +}; + typedef struct SCSIRequest { SCSIBus *bus; SCSIDevice *dev; @@ -28,6 +34,7 @@ typedef struct SCSIRequest { int len; size_t xfer; uint64_t lba; + enum SCSIXferMode mode; } cmd; BlockDriverAIOCB *aiocb; QTAILQ_ENTRY(SCSIRequest) next;