mirror of
https://github.com/opnsense/src.git
synced 2026-03-14 22:53:16 -04:00
MFC r203489:
Return CAM_RELEASE_SIMQ flag only when it is needed, when SIM really was frozen before and should be released.
This commit is contained in:
parent
66a894f383
commit
9a1be4e8d1
1 changed files with 10 additions and 12 deletions
|
|
@ -3101,6 +3101,7 @@ ciss_cam_action_io(struct cam_sim *sim, struct ccb_scsiio *csio)
|
|||
*/
|
||||
if ((error = ciss_get_request(sc, &cr)) != 0) {
|
||||
xpt_freeze_simq(sim, 1);
|
||||
csio->ccb_h.status |= CAM_RELEASE_SIMQ;
|
||||
csio->ccb_h.status |= CAM_REQUEUE_REQ;
|
||||
return(error);
|
||||
}
|
||||
|
|
@ -3152,8 +3153,8 @@ ciss_cam_action_io(struct cam_sim *sim, struct ccb_scsiio *csio)
|
|||
*/
|
||||
if ((error = ciss_start(cr)) != 0) {
|
||||
xpt_freeze_simq(sim, 1);
|
||||
csio->ccb_h.status |= CAM_RELEASE_SIMQ;
|
||||
if (error == EINPROGRESS) {
|
||||
csio->ccb_h.status |= CAM_RELEASE_SIMQ;
|
||||
error = 0;
|
||||
} else {
|
||||
csio->ccb_h.status |= CAM_REQUEUE_REQ;
|
||||
|
|
@ -3181,7 +3182,7 @@ ciss_cam_emulate(struct ciss_softc *sc, struct ccb_scsiio *csio)
|
|||
|
||||
if (CISS_IS_PHYSICAL(bus)) {
|
||||
if (sc->ciss_physical[CISS_CAM_TO_PBUS(bus)][target].cp_online != 1) {
|
||||
csio->ccb_h.status = CAM_SEL_TIMEOUT;
|
||||
csio->ccb_h.status |= CAM_SEL_TIMEOUT;
|
||||
xpt_done((union ccb *)csio);
|
||||
return(1);
|
||||
} else
|
||||
|
|
@ -3194,7 +3195,7 @@ ciss_cam_emulate(struct ciss_softc *sc, struct ccb_scsiio *csio)
|
|||
* Other errors might be better.
|
||||
*/
|
||||
if (sc->ciss_logical[bus][target].cl_status != CISS_LD_ONLINE) {
|
||||
csio->ccb_h.status = CAM_SEL_TIMEOUT;
|
||||
csio->ccb_h.status |= CAM_SEL_TIMEOUT;
|
||||
xpt_done((union ccb *)csio);
|
||||
return(1);
|
||||
}
|
||||
|
|
@ -3208,7 +3209,7 @@ ciss_cam_emulate(struct ciss_softc *sc, struct ccb_scsiio *csio)
|
|||
if (((csio->ccb_h.flags & CAM_CDB_POINTER) ?
|
||||
*(u_int8_t *)csio->cdb_io.cdb_ptr : csio->cdb_io.cdb_bytes[0]) == SYNCHRONIZE_CACHE) {
|
||||
ciss_flush_adapter(sc);
|
||||
csio->ccb_h.status = CAM_REQ_CMP;
|
||||
csio->ccb_h.status |= CAM_REQ_CMP;
|
||||
xpt_done((union ccb *)csio);
|
||||
return(1);
|
||||
}
|
||||
|
|
@ -3269,13 +3270,13 @@ ciss_cam_complete(struct ciss_request *cr)
|
|||
/* no status due to adapter error */
|
||||
case -1:
|
||||
debug(0, "adapter error");
|
||||
csio->ccb_h.status = CAM_REQ_CMP_ERR;
|
||||
csio->ccb_h.status |= CAM_REQ_CMP_ERR;
|
||||
break;
|
||||
|
||||
/* no status due to command completed OK */
|
||||
case SCSI_STATUS_OK: /* CISS_SCSI_STATUS_GOOD */
|
||||
debug(2, "SCSI_STATUS_OK");
|
||||
csio->ccb_h.status = CAM_REQ_CMP;
|
||||
csio->ccb_h.status |= CAM_REQ_CMP;
|
||||
break;
|
||||
|
||||
/* check condition, sense data included */
|
||||
|
|
@ -3286,7 +3287,7 @@ ciss_cam_complete(struct ciss_request *cr)
|
|||
bcopy(&ce->sense_info[0], &csio->sense_data, ce->sense_length);
|
||||
csio->sense_len = ce->sense_length;
|
||||
csio->resid = ce->residual_count;
|
||||
csio->ccb_h.status = CAM_SCSI_STATUS_ERROR | CAM_AUTOSNS_VALID;
|
||||
csio->ccb_h.status |= CAM_SCSI_STATUS_ERROR | CAM_AUTOSNS_VALID;
|
||||
#ifdef CISS_DEBUG
|
||||
{
|
||||
struct scsi_sense_data *sns = (struct scsi_sense_data *)&ce->sense_info[0];
|
||||
|
|
@ -3297,21 +3298,18 @@ ciss_cam_complete(struct ciss_request *cr)
|
|||
|
||||
case SCSI_STATUS_BUSY: /* CISS_SCSI_STATUS_BUSY */
|
||||
debug(0, "SCSI_STATUS_BUSY");
|
||||
csio->ccb_h.status = CAM_SCSI_BUSY;
|
||||
csio->ccb_h.status |= CAM_SCSI_BUSY;
|
||||
break;
|
||||
|
||||
default:
|
||||
debug(0, "unknown status 0x%x", csio->scsi_status);
|
||||
csio->ccb_h.status = CAM_REQ_CMP_ERR;
|
||||
csio->ccb_h.status |= CAM_REQ_CMP_ERR;
|
||||
break;
|
||||
}
|
||||
|
||||
/* handle post-command fixup */
|
||||
ciss_cam_complete_fixup(sc, csio);
|
||||
|
||||
/* tell CAM we're ready for more commands */
|
||||
csio->ccb_h.status |= CAM_RELEASE_SIMQ;
|
||||
|
||||
ciss_release_request(cr);
|
||||
xpt_done((union ccb *)csio);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue