Date: Thu, 4 Feb 2010 14:40:08 +0000 (UTC) From: Alexander Motin <mav@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r203489 - head/sys/dev/ciss Message-ID: <201002041440.o14Ee887044987@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: mav Date: Thu Feb 4 14:40:08 2010 New Revision: 203489 URL: http://svn.freebsd.org/changeset/base/203489 Log: Return CAM_RELEASE_SIMQ flag only when it is needed, when SIM really was frozen before and should be released. Modified: head/sys/dev/ciss/ciss.c Modified: head/sys/dev/ciss/ciss.c ============================================================================== --- head/sys/dev/ciss/ciss.c Thu Feb 4 14:11:15 2010 (r203488) +++ head/sys/dev/ciss/ciss.c Thu Feb 4 14:40:08 2010 (r203489) @@ -3065,6 +3065,7 @@ ciss_cam_action_io(struct cam_sim *sim, */ 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); } @@ -3116,8 +3117,8 @@ ciss_cam_action_io(struct cam_sim *sim, */ 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; @@ -3145,7 +3146,7 @@ ciss_cam_emulate(struct ciss_softc *sc, 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 @@ -3158,7 +3159,7 @@ ciss_cam_emulate(struct ciss_softc *sc, * 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); } @@ -3172,7 +3173,7 @@ ciss_cam_emulate(struct ciss_softc *sc, 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); } @@ -3233,13 +3234,13 @@ ciss_cam_complete(struct ciss_request *c /* 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 */ @@ -3250,7 +3251,7 @@ ciss_cam_complete(struct ciss_request *c 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]; @@ -3261,21 +3262,18 @@ ciss_cam_complete(struct ciss_request *c 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); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201002041440.o14Ee887044987>