diff options
author | mjacob <mjacob@cvs.openbsd.org> | 2000-12-06 01:07:24 +0000 |
---|---|---|
committer | mjacob <mjacob@cvs.openbsd.org> | 2000-12-06 01:07:24 +0000 |
commit | c70f3f9f0bbbc52b0552703642baf6b5d4ea3975 (patch) | |
tree | 0a5ac0f3aee2621f25501c6b87ef8af732fca14a /sys/dev/ic/isp.c | |
parent | a3c56baf1776d67e865aedba84545540a5da2da0 (diff) |
Update isp codebase to current common head- USEC_SLEEP macro added,
instrumentation for interrupts, specific topology preferences for
the 2200. Fix the hole in the OpenBSD port becuause there'd been
no maxluns limit from the midlayer and have the command routine
bounce commands > the maxluns for a particular controller (in
particular, Qlogic FC cards where we can't tell when it hasn't been
us that have loaded the F/W whether or not SCCLUN is in effect
or not).
Diffstat (limited to 'sys/dev/ic/isp.c')
-rw-r--r-- | sys/dev/ic/isp.c | 52 |
1 files changed, 37 insertions, 15 deletions
diff --git a/sys/dev/ic/isp.c b/sys/dev/ic/isp.c index 66c3403a77e..ef4c101a4dd 100644 --- a/sys/dev/ic/isp.c +++ b/sys/dev/ic/isp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: isp.c,v 1.17 2000/10/16 01:01:58 mjacob Exp $ */ +/* $OpenBSD: isp.c,v 1.18 2000/12/06 01:07:21 mjacob Exp $ */ /* * Machine and OS Independent (well, as best as possible) * code for the Qlogic ISP SCSI adapters. @@ -89,7 +89,7 @@ static char *ldumped = "Target %d (Loop ID 0x%x) Port 0x%x dumped after login info mismatch"; #endif static char *notresp = - "Not RESPONSE in RESPONSE Queue (type 0x%x) @ idx %d (next %d)"; + "Not RESPONSE in RESPONSE Queue (type 0x%x) @ idx %d (next %d) nlooked %d"; static char *xact1 = "HBA attempted queued transaction with disconnect not set for %d.%d.%d"; static char *xact2 = @@ -376,6 +376,11 @@ isp_reset(isp) } /* + * Clear instrumentation + */ + isp->isp_intcnt = isp->isp_intbogus = 0; + + /* * Do MD specific pre initialization */ ISP_RESET0(isp); @@ -609,7 +614,7 @@ again: mbs.param[1] = ISP_CODE_ORG; isp_mboxcmd(isp, &mbs, MBLOGNONE); /* give it a chance to start */ - USEC_DELAY(500); + USEC_SLEEP(isp, 500); if (IS_SCSI(isp)) { /* @@ -1078,10 +1083,20 @@ isp_fibre_init(isp) /* * Prefer or force Point-To-Point instead Loop? */ - if (isp->isp_confopts & ISP_CFG_NPORT) + switch(isp->isp_confopts & ISP_CFG_PORT_PREF) { + case ISP_CFG_NPORT: icbp->icb_xfwoptions = ICBXOPT_PTP_2_LOOP; - else + break; + case ISP_CFG_NPORT_ONLY: + icbp->icb_xfwoptions = ICBXOPT_PTP_ONLY; + break; + case ISP_CFG_LPORT_ONLY: + icbp->icb_xfwoptions = ICBXOPT_LOOP_ONLY; + break; + default: icbp->icb_xfwoptions = ICBXOPT_LOOP_2_PTP; + break; + } } icbp->icb_logintime = 60; /* 60 second login timeout */ @@ -1291,11 +1306,11 @@ isp_fclink_test(isp, usdelay) count += 1000; enano = (1000 * 1000) - enano; while (enano > (u_int64_t) 4000000000U) { - USEC_DELAY(4000000); + USEC_SLEEP(isp, 4000000); enano -= (u_int64_t) 4000000000U; } wrk = enano; - USEC_DELAY(wrk/1000); + USEC_SLEEP(isp, wrk/1000); } else { while (enano > (u_int64_t) 4000000000U) { count += 4000000; @@ -2487,7 +2502,9 @@ isp_intr(arg) isp_prt(isp, ISP_LOGDEBUG3, "isp_intr isr %x sem %x", isr, sema); isr &= INT_PENDING_MASK(isp); sema &= BIU_SEMA_LOCK; + isp->isp_intcnt++; if (isr == 0 && sema == 0) { + isp->isp_intbogus++; return (0); } @@ -2622,7 +2639,12 @@ isp_intr(arg) */ if (sp->req_header.rqs_entry_type != RQSTYPE_REQUEST) { isp_prt(isp, ISP_LOGERR, notresp, - sp->req_header.rqs_entry_type, oop, optr); + sp->req_header.rqs_entry_type, oop, optr, + nlooked); + if (isp->isp_dblev & ISP_LOGDEBUG0) { + isp_print_bytes(isp, "Queue Entry", + QENTRY_LEN, sp); + } MEMZERO(sp, sizeof (isphdr_t)); continue; } @@ -2850,6 +2872,9 @@ isp_parse_async(isp, mbox) isp_prt(isp, ISP_LOGERR, "Internal FW Error @ RISC Addr 0x%x", mbox); isp_reinit(isp); +#ifdef ISP_TARGET_MODE + isp_target_async(isp, bus, mbox); +#endif /* no point continuing after this */ return (-1); @@ -3054,6 +3079,9 @@ isp_parse_async(isp, mbox) case ISP_CONN_FATAL: isp_prt(isp, ISP_LOGERR, "FATAL CONNECTION ERROR"); isp_reinit(isp); +#ifdef ISP_TARGET_MODE + isp_target_async(isp, bus, ASYNC_SYSTEM_ERROR); +#endif /* no point continuing after this */ return (-1); @@ -3127,7 +3155,7 @@ isp_parse_status(isp, sp, xs) if ((sp->req_state_flags & RQSF_GOT_TARGET) == 0) { isp_prt(isp, ISP_LOGDEBUG1, "Selection Timeout for %d.%d.%d", - XS_TGT(xs), XS_LUN(xs), XS_CHANNEL(xs)); + XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); if (XS_NOERR(xs)) { XS_SETERR(xs, HBA_SELTIMEOUT); } @@ -3996,12 +4024,6 @@ isp_mboxcmd(isp, mbp, logmask) ISP_WRITE(isp, HCCR, HCCR_CMD_SET_HOST_INT); /* - * Give the f/w a chance to pick this up. - */ - USEC_DELAY(250); - - - /* * While we haven't finished the command, spin our wheels here. */ MBOX_WAIT_COMPLETE(isp); |