Merge from r225950:
Set the sense residual properly. Reviewed by: ken
This commit is contained in:
parent
f8244106ab
commit
1e5addb750
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=226350
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -424,6 +424,13 @@ static void hptiop_request_callback_itl(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 (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;
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user