From patchwork Wed Feb 22 14:33:43 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 142469 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id A1BD5B6F9F for ; Thu, 23 Feb 2012 01:35:39 +1100 (EST) Received: from localhost ([::1]:44758 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S0DI0-0004hZ-Oh for incoming@patchwork.ozlabs.org; Wed, 22 Feb 2012 09:35:28 -0500 Received: from eggs.gnu.org ([140.186.70.92]:37627) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S0DH5-0003Cg-Dv for qemu-devel@nongnu.org; Wed, 22 Feb 2012 09:34:33 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1S0DGv-0002Og-L2 for qemu-devel@nongnu.org; Wed, 22 Feb 2012 09:34:31 -0500 Received: from mail-pz0-f45.google.com ([209.85.210.45]:44009) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S0DGv-0002Mp-Dp for qemu-devel@nongnu.org; Wed, 22 Feb 2012 09:34:21 -0500 Received: by mail-pz0-f45.google.com with SMTP id p14so104760dad.4 for ; Wed, 22 Feb 2012 06:34:21 -0800 (PST) Received-SPF: pass (google.com: domain of paolo.bonzini@gmail.com designates 10.68.218.167 as permitted sender) client-ip=10.68.218.167; Authentication-Results: mr.google.com; spf=pass (google.com: domain of paolo.bonzini@gmail.com designates 10.68.218.167 as permitted sender) smtp.mail=paolo.bonzini@gmail.com; dkim=pass header.i=paolo.bonzini@gmail.com Received: from mr.google.com ([10.68.218.167]) by 10.68.218.167 with SMTP id ph7mr88902732pbc.110.1329921260999 (num_hops = 1); Wed, 22 Feb 2012 06:34:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=sender:from:to:subject:date:message-id:x-mailer:in-reply-to :references; bh=e3oADLYbtKT0WtP34Dsw39/LWOY9qofIPlwQS53nM9s=; b=vUY1oNShXlqzi2ubLSIOUnkQ7TIGY37tsX56norcmrCha0k/BXVV8i0hBegZQZqvER s7nZZBBXESiZu8grcannAhAKar/1xnCezKeTFc83IZWMpD24X1u1bhOU3mHyNCPPZcNz kpVnIW7J4ovzpl1jvQ29vFU32508+njoIBzME= Received: by 10.68.218.167 with SMTP id ph7mr73228512pbc.110.1329921260889; Wed, 22 Feb 2012 06:34:20 -0800 (PST) Received: from yakj.usersys.redhat.com (93-34-182-16.ip50.fastwebnet.it. [93.34.182.16]) by mx.google.com with ESMTPS id q1sm19120759pbv.49.2012.02.22.06.34.18 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 22 Feb 2012 06:34:19 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Wed, 22 Feb 2012 15:33:43 +0100 Message-Id: <1329921236-23461-6-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.7.7.6 In-Reply-To: <1329921236-23461-1-git-send-email-pbonzini@redhat.com> References: <1329921236-23461-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.85.210.45 Subject: [Qemu-devel] [PATCH v4 05/18] scsi: pass residual amount to command_complete X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org With the upcoming sglist support, HBAs will not see any transfer_data call and will not have a way to detect short transfers. So pass the residual amount of data upon command completion. Signed-off-by: Paolo Bonzini --- hw/esp.c | 3 ++- hw/lsi53c895a.c | 2 +- hw/scsi-bus.c | 12 ++++++++---- hw/scsi.h | 3 ++- hw/spapr_vscsi.c | 2 +- hw/usb-msd.c | 2 +- 6 files changed, 15 insertions(+), 9 deletions(-) diff --git a/hw/esp.c b/hw/esp.c index 2dda8e3..8d73e56 100644 --- a/hw/esp.c +++ b/hw/esp.c @@ -390,7 +390,8 @@ static void esp_do_dma(ESPState *s) esp_dma_done(s); } -static void esp_command_complete(SCSIRequest *req, uint32_t status) +static void esp_command_complete(SCSIRequest *req, uint32_t status, + size_t resid) { ESPState *s = DO_UPCAST(ESPState, busdev.qdev, req->bus->qbus.parent); diff --git a/hw/lsi53c895a.c b/hw/lsi53c895a.c index 0acd1d0..edc09b7 100644 --- a/hw/lsi53c895a.c +++ b/hw/lsi53c895a.c @@ -699,7 +699,7 @@ static int lsi_queue_req(LSIState *s, SCSIRequest *req, uint32_t len) } /* Callback to indicate that the SCSI layer has completed a command. */ -static void lsi_command_complete(SCSIRequest *req, uint32_t status) +static void lsi_command_complete(SCSIRequest *req, uint32_t status, size_t resid) { LSIState *s = DO_UPCAST(LSIState, dev.qdev, req->bus->qbus.parent); int out; diff --git a/hw/scsi-bus.c b/hw/scsi-bus.c index b3e97ce..eb97c87 100644 --- a/hw/scsi-bus.c +++ b/hw/scsi-bus.c @@ -533,6 +533,8 @@ SCSIRequest *scsi_req_new(SCSIDevice *d, uint32_t tag, uint32_t lun, } req->cmd = cmd; + req->resid = req->cmd.xfer; + switch (buf[0]) { case INQUIRY: trace_scsi_inquiry(d->id, lun, tag, cmd.buf[1], cmd.buf[2]); @@ -1275,10 +1277,12 @@ void scsi_req_data(SCSIRequest *req, int len) { if (req->io_canceled) { trace_scsi_req_data_canceled(req->dev->id, req->lun, req->tag, len); - } else { - trace_scsi_req_data(req->dev->id, req->lun, req->tag, len); - req->bus->info->transfer_data(req, len); + return; } + trace_scsi_req_data(req->dev->id, req->lun, req->tag, len); + assert(req->cmd.mode != SCSI_XFER_NONE); + req->resid -= len; + req->bus->info->transfer_data(req, len); } void scsi_req_print(SCSIRequest *req) @@ -1337,7 +1341,7 @@ void scsi_req_complete(SCSIRequest *req, int status) scsi_req_ref(req); scsi_req_dequeue(req); - req->bus->info->complete(req, req->status); + req->bus->info->complete(req, req->status, req->resid); scsi_req_unref(req); } diff --git a/hw/scsi.h b/hw/scsi.h index dc72b6f..8722ef9 100644 --- a/hw/scsi.h +++ b/hw/scsi.h @@ -46,6 +46,7 @@ struct SCSIRequest { uint32_t tag; uint32_t lun; uint32_t status; + size_t resid; SCSICommand cmd; BlockDriverAIOCB *aiocb; uint8_t sense[SCSI_SENSE_BUF_SIZE]; @@ -112,7 +113,7 @@ struct SCSIBusInfo { int tcq; int max_channel, max_target, max_lun; void (*transfer_data)(SCSIRequest *req, uint32_t arg); - void (*complete)(SCSIRequest *req, uint32_t arg); + void (*complete)(SCSIRequest *req, uint32_t arg, size_t resid); void (*cancel)(SCSIRequest *req); }; diff --git a/hw/spapr_vscsi.c b/hw/spapr_vscsi.c index ffce261..2167017 100644 --- a/hw/spapr_vscsi.c +++ b/hw/spapr_vscsi.c @@ -494,7 +494,7 @@ static void vscsi_transfer_data(SCSIRequest *sreq, uint32_t len) } /* Callback to indicate that the SCSI layer has completed a transfer. */ -static void vscsi_command_complete(SCSIRequest *sreq, uint32_t status) +static void vscsi_command_complete(SCSIRequest *sreq, uint32_t status, size_t resid) { VSCSIState *s = DO_UPCAST(VSCSIState, vdev.qdev, sreq->bus->qbus.parent); vscsi_req *req = sreq->hba_private; diff --git a/hw/usb-msd.c b/hw/usb-msd.c index c933efe..5fbd2d0 100644 --- a/hw/usb-msd.c +++ b/hw/usb-msd.c @@ -223,7 +223,7 @@ static void usb_msd_transfer_data(SCSIRequest *req, uint32_t len) } } -static void usb_msd_command_complete(SCSIRequest *req, uint32_t status) +static void usb_msd_command_complete(SCSIRequest *req, uint32_t status, size_t resid) { MSDState *s = DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent); USBPacket *p = s->packet;