diff options
author | mjacob <mjacob@FreeBSD.org> | 2001-02-11 03:47:39 +0000 |
---|---|---|
committer | mjacob <mjacob@FreeBSD.org> | 2001-02-11 03:47:39 +0000 |
commit | 112a82d6e9f1fb88852b1b3827dc678fd12244d7 (patch) | |
tree | d219474100bca7281cb54838f96b320e8affff8a | |
parent | 7dd5f5b0cdc44f0ba8bb025b1c804627cd8784fd (diff) | |
download | FreeBSD-src-112a82d6e9f1fb88852b1b3827dc678fd12244d7.zip FreeBSD-src-112a82d6e9f1fb88852b1b3827dc678fd12244d7.tar.gz |
Do some cleanup based upon adapter role- mainly not enabling interrupts
if we're ISP_ROLE_NONE. Change ISPASYNC_LOGGED_INOUT to ISPASYNC_PROMENADE.
Make sure we note if something is a fabric device.
Target mode:
Finally fix (to a first approximation) SCSI Target Mode again- we needed
to correctly check against CAM_TARGET_WILDCARD and CAM_LUN_WILDCARD
so that targbh won't confuse us. Comment out the drainqueue stuff for
now. Use isp_fc_runstate instead if isp_control/ISPCTL_FCLINK_TEST.
-rw-r--r-- | sys/dev/isp/isp_freebsd.c | 68 |
1 files changed, 33 insertions, 35 deletions
diff --git a/sys/dev/isp/isp_freebsd.c b/sys/dev/isp/isp_freebsd.c index 72fb71b..d6f9c8b 100644 --- a/sys/dev/isp/isp_freebsd.c +++ b/sys/dev/isp/isp_freebsd.c @@ -139,8 +139,10 @@ isp_attach(struct ispsoftc *isp) isp->isp_sim2 = sim; isp->isp_path2 = path; } - isp->isp_state = ISP_RUNSTATE; - ENABLE_INTS(isp); + if (isp->isp_role != ISP_ROLE_NONE) { + isp->isp_state = ISP_RUNSTATE; + ENABLE_INTS(isp); + } if (isplist == NULL) { isplist = isp; } else { @@ -156,8 +158,10 @@ static void isp_intr_enable(void *arg) { struct ispsoftc *isp = arg; - ENABLE_INTS(isp); - isp->isp_osinfo.intsok = 1; + if (isp->isp_role != ISP_ROLE_NONE) { + ENABLE_INTS(isp); + isp->isp_osinfo.intsok = 1; + } /* Release our hook so that the boot can continue. */ config_intrhook_disestablish(&isp->isp_osinfo.ehook); } @@ -404,38 +408,49 @@ isp_en_lun(struct ispsoftc *isp, union ccb *ccb) * Do some sanity checking first. */ - if (lun < 0 || lun >= (lun_id_t) isp->isp_maxluns) { + if ((lun != CAM_LUN_WILDCARD) && + (lun < 0 || lun >= (lun_id_t) isp->isp_maxluns)) { ccb->ccb_h.status = CAM_LUN_INVALID; return; } if (IS_SCSI(isp)) { if (tgt != CAM_TARGET_WILDCARD && - tgt != ((sdparam *) isp->isp_param)->isp_initiator_id) { + tgt != SDPARAM(isp)->isp_initiator_id) { ccb->ccb_h.status = CAM_TID_INVALID; return; } } else { if (tgt != CAM_TARGET_WILDCARD && - tgt != ((fcparam *) isp->isp_param)->isp_loopid) { + tgt != FCPARAM(isp)->isp_iid) { ccb->ccb_h.status = CAM_TID_INVALID; return; } } + if (tgt == CAM_TARGET_WILDCARD) { + if (lun != CAM_LUN_WILDCARD) { + ccb->ccb_h.status = CAM_LUN_INVALID; + return; + } + } + /* * If Fibre Channel, stop and drain all activity to this bus. */ +#if 0 if (IS_FC(isp)) { ISP_LOCK(isp); frozen = 1; xpt_freeze_simq(isp->isp_sim, 1); isp->isp_osinfo.drain = 1; - /* ISP_UNLOCK(isp); XXX NEED CV_WAIT HERE XXX */ while (isp->isp_osinfo.drain) { - tsleep(&isp->isp_osinfo.drain, PRIBIO, "ispdrain", 0); + (void) msleep(&isp->isp_osinfo.drain, + &isp->isp_osinfo.lock, PRIBIO, + "ispdrain", 10 * hz); } ISP_UNLOCK(isp); } +#endif /* * Check to see if we're enabling on fibre channel and @@ -444,24 +459,14 @@ isp_en_lun(struct ispsoftc *isp, union ccb *ccb) */ if (IS_FC(isp) && cel->enable && (isp->isp_osinfo.tmflags & TM_TMODE_ENABLED) == 0) { - int rv= 2 * 1000000; fcparam *fcp = isp->isp_param; + int rv; ISP_LOCK(isp); - rv = isp_control(isp, ISPCTL_FCLINK_TEST, &rv); + rv = isp_fc_runstate(isp, 2 * 1000000); ISP_UNLOCK(isp); - if (rv || fcp->isp_fwstate != FW_READY) { - xpt_print_path(ccb->ccb_h.path); - printf("link status not good yet\n"); - ccb->ccb_h.status = CAM_REQ_CMP_ERR; - if (frozen) - xpt_release_simq(isp->isp_sim, 1); - return; - } - ISP_LOCK(isp); - rv = isp_control(isp, ISPCTL_PDB_SYNC, NULL); - ISP_UNLOCK(isp); - if (rv || fcp->isp_fwstate != FW_READY) { + if (fcp->isp_fwstate != FW_READY || + fcp->isp_loopstate != LOOP_READY) { xpt_print_path(ccb->ccb_h.path); printf("could not get a good port database read\n"); ccb->ccb_h.status = CAM_REQ_CMP_ERR; @@ -2087,25 +2092,20 @@ isp_async(struct ispsoftc *isp, ispasync_t cmd, void *arg) } isp_prt(isp, ISP_LOGINFO, "Loop UP"); break; - case ISPASYNC_LOGGED_INOUT: + case ISPASYNC_PROMENADE: { const char *fmt = "Target %d (Loop 0x%x) Port ID 0x%x " - "role %s %s\n Port WWN 0x%08x%08x\n Node WWN 0x%08x%08x"; - const static char *roles[4] = { + "(role %s) %s\n Port WWN 0x%08x%08x\n Node WWN 0x%08x%08x"; + static const char *roles[4] = { "(none)", "Target", "Initiator", "Target/Initiator" }; - char *ptr; fcparam *fcp = isp->isp_param; int tgt = *((int *) arg); struct lportdb *lp = &fcp->portdb[tgt]; - if (lp->valid) { - ptr = "arrived"; - } else { - ptr = "disappeared"; - } isp_prt(isp, ISP_LOGINFO, fmt, tgt, lp->loopid, lp->portid, - roles[lp->roles & 0x3], ptr, + roles[lp->roles & 0x3], + (lp->valid)? "Arrived" : "Departed", (u_int32_t) (lp->port_wwn >> 32), (u_int32_t) (lp->port_wwn & 0xffffffffLL), (u_int32_t) (lp->node_wwn >> 32), @@ -2121,7 +2121,6 @@ isp_async(struct ispsoftc *isp, ispasync_t cmd, void *arg) "Name Server Database Changed"); } break; -#ifdef ISP2100_FABRIC case ISPASYNC_FABRIC_DEV: { int target, lrange; @@ -2236,7 +2235,6 @@ isp_async(struct ispsoftc *isp, ispasync_t cmd, void *arg) lp->fabric_dev = 1; break; } -#endif #ifdef ISP_TARGET_MODE case ISPASYNC_TARGET_MESSAGE: { |