From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:44553) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QoX8s-0005St-CZ for qemu-devel@nongnu.org; Wed, 03 Aug 2011 04:49:31 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QoX8r-0003gQ-9e for qemu-devel@nongnu.org; Wed, 03 Aug 2011 04:49:30 -0400 Received: from mail-wy0-f173.google.com ([74.125.82.173]:44070) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QoX8q-0003gH-VX for qemu-devel@nongnu.org; Wed, 03 Aug 2011 04:49:29 -0400 Received: by wye20 with SMTP id 20so154406wye.4 for ; Wed, 03 Aug 2011 01:49:28 -0700 (PDT) Sender: Paolo Bonzini From: Paolo Bonzini Date: Wed, 3 Aug 2011 10:49:05 +0200 Message-Id: <1312361359-15445-3-git-send-email-pbonzini@redhat.com> In-Reply-To: <1312361359-15445-1-git-send-email-pbonzini@redhat.com> References: <1312361359-15445-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH 02/16] vscsi: always use get_sense List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org vscsi supports autosensing by providing sense data directly in the response. When get_sense was added, the older state machine approach that sent REQUEST SENSE commands separately was left in place. Remove it, all existing SCSIDevices do support autosensing and the next patches will make the support come for free from the SCSIBus. Signed-off-by: Paolo Bonzini --- hw/spapr_vscsi.c | 91 ++++++++++++----------------------------------------- 1 files changed, 21 insertions(+), 70 deletions(-) diff --git a/hw/spapr_vscsi.c b/hw/spapr_vscsi.c index 646b1e3..c65308c 100644 --- a/hw/spapr_vscsi.c +++ b/hw/spapr_vscsi.c @@ -80,7 +80,6 @@ typedef struct vscsi_req { int active; long data_len; int writing; - int sensing; int senselen; uint8_t sense[SCSI_SENSE_BUF_SIZE]; @@ -436,40 +435,6 @@ static int vscsi_preprocess_desc(vscsi_req *req) return 0; } -static void vscsi_send_request_sense(VSCSIState *s, vscsi_req *req) -{ - uint8_t *cdb = req->iu.srp.cmd.cdb; - int n; - - n = scsi_req_get_sense(req->sreq, req->sense, sizeof(req->sense)); - if (n) { - req->senselen = n; - vscsi_send_rsp(s, req, CHECK_CONDITION, 0, 0); - vscsi_put_req(req); - return; - } - - dprintf("VSCSI: Got CHECK_CONDITION, requesting sense...\n"); - cdb[0] = 3; - cdb[1] = 0; - cdb[2] = 0; - cdb[3] = 0; - cdb[4] = 96; - cdb[5] = 0; - req->sensing = 1; - n = scsi_req_enqueue(req->sreq, cdb); - dprintf("VSCSI: Queued request sense tag 0x%x\n", req->qtag); - if (n < 0) { - fprintf(stderr, "VSCSI: REQUEST_SENSE wants write data !?!?!?\n"); - vscsi_makeup_sense(s, req, HARDWARE_ERROR, 0, 0); - scsi_req_abort(req->sreq, CHECK_CONDITION); - return; - } else if (n == 0) { - return; - } - scsi_req_continue(req->sreq); -} - /* Callback to indicate that the SCSI layer has completed a transfer. */ static void vscsi_transfer_data(SCSIRequest *sreq, uint32_t len) { @@ -485,23 +450,6 @@ static void vscsi_transfer_data(SCSIRequest *sreq, uint32_t len) return; } - if (req->sensing) { - uint8_t *buf = scsi_req_get_buf(sreq); - - len = MIN(len, SCSI_SENSE_BUF_SIZE); - dprintf("VSCSI: Sense data, %d bytes:\n", len); - dprintf(" %02x %02x %02x %02x %02x %02x %02x %02x\n", - buf[0], buf[1], buf[2], buf[3], - buf[4], buf[5], buf[6], buf[7]); - dprintf(" %02x %02x %02x %02x %02x %02x %02x %02x\n", - buf[8], buf[9], buf[10], buf[11], - buf[12], buf[13], buf[14], buf[15]); - memcpy(req->sense, buf, len); - req->senselen = len; - scsi_req_continue(req->sreq); - return; - } - if (len) { buf = scsi_req_get_buf(sreq); rc = vscsi_srp_transfer_data(s, req, req->writing, buf, len); @@ -532,28 +480,31 @@ static void vscsi_command_complete(SCSIRequest *sreq, uint32_t status) return; } - if (!req->sensing && status == CHECK_CONDITION) { - vscsi_send_request_sense(s, req); - return; + if (status == CHECK_CONDITION) { + req->senselen = scsi_req_get_sense(req->sreq, req->sense, + sizeof(req->sense)); + status = 0; + dprintf("VSCSI: Sense data, %d bytes:\n", len); + dprintf(" %02x %02x %02x %02x %02x %02x %02x %02x\n", + req->sense[0], req->sense[1], req->sense[2], req->sense[3], + req->sense[4], req->sense[5], req->sense[6], req->sense[7]); + dprintf(" %02x %02x %02x %02x %02x %02x %02x %02x\n", + req->sense[8], req->sense[9], req->sense[10], req->sense[11], + req->sense[12], req->sense[13], req->sense[14], req->sense[15]); } - if (req->sensing) { - dprintf("VSCSI: Sense done !\n"); - status = CHECK_CONDITION; - } else { - dprintf("VSCSI: Command complete err=%d\n", status); - if (status == 0) { - /* We handle overflows, not underflows for normal commands, - * but hopefully nobody cares - */ - if (req->writing) { - res_out = req->data_len; - } else { - res_in = req->data_len; - } + dprintf("VSCSI: Command complete err=%d\n", status); + if (status == 0) { + /* We handle overflows, not underflows for normal commands, + * but hopefully nobody cares + */ + if (req->writing) { + res_out = req->data_len; + } else { + res_in = req->data_len; } } - vscsi_send_rsp(s, req, 0, res_in, res_out); + vscsi_send_rsp(s, req, status, res_in, res_out); vscsi_put_req(req); } -- 1.7.6