summaryrefslogtreecommitdiffstats
path: root/sys/dev
diff options
context:
space:
mode:
authormarius <marius@FreeBSD.org>2011-10-13 20:06:19 +0000
committermarius <marius@FreeBSD.org>2011-10-13 20:06:19 +0000
commit03f042f32ea4a1b4d4867c8d56885f1f29f8b5b0 (patch)
treec06ee1d9af97642c074b8b2f67c22e536ea6a8fb /sys/dev
parent9d926ddf66d0bdefacfd2f642dd15d42f3a2194b (diff)
downloadFreeBSD-src-03f042f32ea4a1b4d4867c8d56885f1f29f8b5b0.zip
FreeBSD-src-03f042f32ea4a1b4d4867c8d56885f1f29f8b5b0.tar.gz
Merge from r225950:
Set the sense residual properly. Reviewed by: ken
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/aac/aac_cam.c20
-rw-r--r--sys/dev/asr/asr.c14
-rw-r--r--sys/dev/hptiop/hptiop.c14
-rw-r--r--sys/dev/mfi/mfi_cam.c8
4 files changed, 46 insertions, 10 deletions
diff --git a/sys/dev/aac/aac_cam.c b/sys/dev/aac/aac_cam.c
index 130cd20..b5c3b26 100644
--- a/sys/dev/aac/aac_cam.c
+++ b/sys/dev/aac/aac_cam.c
@@ -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);
}
diff --git a/sys/dev/asr/asr.c b/sys/dev/asr/asr.c
index ad41431..6034b6f 100644
--- a/sys/dev/asr/asr.c
+++ b/sys/dev/asr/asr.c
@@ -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_MESSAGE_FRAME Packet)
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);
diff --git a/sys/dev/hptiop/hptiop.c b/sys/dev/hptiop/hptiop.c
index 49ffcef..c4e2427 100644
--- a/sys/dev/hptiop/hptiop.c
+++ b/sys/dev/hptiop/hptiop.c
@@ -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(struct hpt_iop_hba * hba,
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;
diff --git a/sys/dev/mfi/mfi_cam.c b/sys/dev/mfi/mfi_cam.c
index 747b6c0..c49daff 100644
--- a/sys/dev/mfi/mfi_cam.c
+++ b/sys/dev/mfi/mfi_cam.c
@@ -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;
OpenPOWER on IntegriCloud