From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:57500) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RSWmy-0006F1-7d for qemu-devel@nongnu.org; Mon, 21 Nov 2011 11:32:13 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RSWmt-0007Zt-T4 for qemu-devel@nongnu.org; Mon, 21 Nov 2011 11:32:12 -0500 Received: from mx1.redhat.com ([209.132.183.28]:36674) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RSWmt-0007YD-K3 for qemu-devel@nongnu.org; Mon, 21 Nov 2011 11:32:07 -0500 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id pALGW1U4004648 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 21 Nov 2011 11:32:01 -0500 From: Gerd Hoffmann Date: Mon, 21 Nov 2011 17:15:43 +0100 Message-Id: <1321892148-16835-3-git-send-email-kraxel@redhat.com> In-Reply-To: <1321892148-16835-1-git-send-email-kraxel@redhat.com> References: <1321892148-16835-1-git-send-email-kraxel@redhat.com> Subject: [Qemu-devel] [PATCH 2/7] usb-storage: fill status in complete callback. List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Gerd Hoffmann Put status word into device state, fill it in command_complete, have usb_msd_send_status just send it out. Signed-off-by: Gerd Hoffmann --- hw/usb-msd.c | 38 +++++++++++++++++++++----------------- 1 files changed, 21 insertions(+), 17 deletions(-) diff --git a/hw/usb-msd.c b/hw/usb-msd.c index 8dde421..5dc4afc 100644 --- a/hw/usb-msd.c +++ b/hw/usb-msd.c @@ -38,6 +38,13 @@ enum USBMSDMode { USB_MSDM_CSW /* Command Status. */ }; +struct usb_msd_csw { + uint32_t sig; + uint32_t tag; + uint32_t residue; + uint8_t status; +}; + typedef struct { USBDevice dev; enum USBMSDMode mode; @@ -46,6 +53,7 @@ typedef struct { uint32_t data_len; uint32_t residue; uint32_t tag; + struct usb_msd_csw csw; SCSIRequest *req; SCSIBus bus; BlockConf conf; @@ -67,13 +75,6 @@ struct usb_msd_cbw { uint8_t cmd[16]; }; -struct usb_msd_csw { - uint32_t sig; - uint32_t tag; - uint32_t residue; - uint8_t status; -}; - enum { STR_MANUFACTURER = 1, STR_PRODUCT, @@ -191,19 +192,15 @@ static void usb_msd_copy_data(MSDState *s, USBPacket *p) static void usb_msd_send_status(MSDState *s, USBPacket *p) { - struct usb_msd_csw csw; int len; DPRINTF("Command status %d tag 0x%x, len %zd\n", - s->result, s->tag, p->iov.size); - csw.sig = cpu_to_le32(0x53425355); - csw.tag = cpu_to_le32(s->tag); - csw.residue = s->residue; - csw.status = s->result; - - len = MIN(sizeof(csw), p->iov.size); - usb_packet_copy(p, &csw, len); - p->result = len; + s->csw.status, s->csw.tag, p->iov.size); + + assert(s->csw.sig == 0x53425355); + len = MIN(sizeof(s->csw), p->iov.size); + usb_packet_copy(p, &s->csw, len); + memset(&s->csw, 0, sizeof(s->csw)); } static void usb_msd_transfer_data(SCSIRequest *req, uint32_t len) @@ -236,6 +233,12 @@ static void usb_msd_command_complete(SCSIRequest *req, uint32_t status) DPRINTF("Command complete %d\n", status); s->residue = s->data_len; s->result = status != 0; + + s->csw.sig = cpu_to_le32(0x53425355); + s->csw.tag = cpu_to_le32(s->tag); + s->csw.residue = s->residue; + s->csw.status = s->result; + if (s->packet) { if (s->data_len == 0 && s->mode == USB_MSDM_DATAOUT) { /* A deferred packet with no write data remaining must be @@ -257,6 +260,7 @@ static void usb_msd_command_complete(SCSIRequest *req, uint32_t status) } else if (s->data_len == 0) { s->mode = USB_MSDM_CSW; } + scsi_req_unref(req); s->req = NULL; } -- 1.7.1