From owner-svn-src-all@FreeBSD.ORG Thu Oct 13 20:06:20 2011 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6986F106566B; Thu, 13 Oct 2011 20:06:20 +0000 (UTC) (envelope-from marius@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 580168FC0C; Thu, 13 Oct 2011 20:06:20 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p9DK6Kwk030389; Thu, 13 Oct 2011 20:06:20 GMT (envelope-from marius@svn.freebsd.org) Received: (from marius@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p9DK6K2L030384; Thu, 13 Oct 2011 20:06:20 GMT (envelope-from marius@svn.freebsd.org) Message-Id: <201110132006.p9DK6K2L030384@svn.freebsd.org> From: Marius Strobl Date: Thu, 13 Oct 2011 20:06:20 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r226350 - in head/sys/dev: aac asr hptiop mfi X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 13 Oct 2011 20:06:20 -0000 Author: marius Date: Thu Oct 13 20:06:19 2011 New Revision: 226350 URL: http://svn.freebsd.org/changeset/base/226350 Log: Merge from r225950: Set the sense residual properly. Reviewed by: ken Modified: head/sys/dev/aac/aac_cam.c head/sys/dev/asr/asr.c head/sys/dev/hptiop/hptiop.c head/sys/dev/mfi/mfi_cam.c Modified: head/sys/dev/aac/aac_cam.c ============================================================================== --- head/sys/dev/aac/aac_cam.c Thu Oct 13 18:25:10 2011 (r226349) +++ head/sys/dev/aac/aac_cam.c Thu Oct 13 20:06:19 2011 (r226350) @@ -532,6 +532,7 @@ aac_cam_complete(struct aac_command *cm) union ccb *ccb; struct aac_srb_response *srbr; struct aac_softc *sc; + int sense_returned; sc = cm->cm_sc; fwprintf(sc, HBA_FLAGS_DBG_FUNCTION_ENTRY_B, ""); @@ -556,16 +557,17 @@ aac_cam_complete(struct aac_command *cm) /* Take care of autosense */ if (srbr->sense_len) { - int sense_len, scsi_sense_len; - - scsi_sense_len = sizeof(struct scsi_sense_data); - bzero(&ccb->csio.sense_data, scsi_sense_len); - sense_len = (srbr->sense_len > - scsi_sense_len) ? scsi_sense_len : - srbr->sense_len; + sense_returned = srbr->sense_len; + if (sense_returned < ccb->csio.sense_len) + ccb->csio.sense_resid = + ccb->csio.sense_len - + sense_returned; + else + ccb->csio.sense_resid = 0; + bzero(&ccb->csio.sense_data, + sizeof(struct scsi_sense_data)); bcopy(&srbr->sense[0], &ccb->csio.sense_data, - srbr->sense_len); - ccb->csio.sense_len = sense_len; + min(ccb->csio.sense_len, sense_returned)); ccb->ccb_h.status |= CAM_AUTOSNS_VALID; // scsi_sense_print(&ccb->csio); } Modified: head/sys/dev/asr/asr.c ============================================================================== --- head/sys/dev/asr/asr.c Thu Oct 13 18:25:10 2011 (r226349) +++ head/sys/dev/asr/asr.c Thu Oct 13 20:06:19 2011 (r226350) @@ -3071,6 +3071,14 @@ asr_intr(Asr_softc_t *sc) && (size > ccb->csio.sense_len)) { size = ccb->csio.sense_len; } + if (size < ccb->csio.sense_len) { + ccb->csio.sense_resid = + ccb->csio.sense_len - size; + } else { + ccb->csio.sense_resid = 0; + } + bzero(&(ccb->csio.sense_data), + sizeof(ccb->csio.sense_data)); bcopy(Reply->SenseData, &(ccb->csio.sense_data), size); } @@ -3566,6 +3574,12 @@ ASR_queue_i(Asr_softc_t *sc, PI2O_MESSAG if (size > sizeof(ccb->csio.sense_data)) { size = sizeof(ccb->csio.sense_data); } + if (size < ccb->csio.sense_len) { + ccb->csio.sense_resid = ccb->csio.sense_len - size; + } else { + ccb->csio.sense_resid = 0; + } + bzero(&(ccb->csio.sense_data), sizeof(ccb->csio.sense_data)); bcopy(&(ccb->csio.sense_data), Reply_Ptr->SenseData, size); I2O_SCSI_ERROR_REPLY_MESSAGE_FRAME_setAutoSenseTransferCount( Reply_Ptr, size); Modified: head/sys/dev/hptiop/hptiop.c ============================================================================== --- head/sys/dev/hptiop/hptiop.c Thu Oct 13 18:25:10 2011 (r226349) +++ head/sys/dev/hptiop/hptiop.c Thu Oct 13 20:06:19 2011 (r226350) @@ -424,6 +424,13 @@ srb_complete: ccb->ccb_h.status = CAM_BUSY; break; case IOP_RESULT_CHECK_CONDITION: + memset(&ccb->csio.sense_data, 0, + sizeof(ccb->csio.sense_data)); + if (dxfer < ccb->csio.sense_len) + ccb->csio.sense_resid = ccb->csio.sense_len - + dxfer; + else + ccb->csio.sense_resid = 0; if (srb->srb_flag & HPT_SRB_FLAG_HIGH_MEM_ACESS) {/*iop*/ bus_space_read_region_1(hba->bar0t, hba->bar0h, index + offsetof(struct hpt_iop_request_scsi_command, @@ -573,6 +580,13 @@ static void hptiop_request_callback_mv(s ccb->ccb_h.status = CAM_BUSY; break; case IOP_RESULT_CHECK_CONDITION: + memset(&ccb->csio.sense_data, 0, + sizeof(ccb->csio.sense_data)); + if (req->dataxfer_length < ccb->csio.sense_len) + ccb->csio.sense_resid = ccb->csio.sense_len - + req->dataxfer_length; + else + ccb->csio.sense_resid = 0; memcpy(&ccb->csio.sense_data, &req->sg_list, MIN(req->dataxfer_length, sizeof(ccb->csio.sense_data))); ccb->ccb_h.status = CAM_SCSI_STATUS_ERROR; Modified: head/sys/dev/mfi/mfi_cam.c ============================================================================== --- head/sys/dev/mfi/mfi_cam.c Thu Oct 13 18:25:10 2011 (r226349) +++ head/sys/dev/mfi/mfi_cam.c Thu Oct 13 20:06:19 2011 (r226350) @@ -354,7 +354,13 @@ mfip_done(struct mfi_command *cm) ccbh->status = CAM_SCSI_STATUS_ERROR | CAM_AUTOSNS_VALID; csio->scsi_status = pt->header.scsi_status; - sense_len = min(pt->header.sense_len, sizeof(struct scsi_sense_data)); + if (pt->header.sense_len < csio->sense_len) + csio->sense_resid = csio->sense_len - + pt->header.sense_len; + else + csio->sense_resid = 0; + sense_len = min(pt->header.sense_len, + sizeof(struct scsi_sense_data)); bzero(&csio->sense_data, sizeof(struct scsi_sense_data)); bcopy(&cm->cm_sense->data[0], &csio->sense_data, sense_len); break;