summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormjacob <mjacob@FreeBSD.org>2000-12-02 18:08:35 +0000
committermjacob <mjacob@FreeBSD.org>2000-12-02 18:08:35 +0000
commitc1744a5f77132fb6fae2b511901a07de7f2e72c7 (patch)
treee20757a089314ce78669f07b4d65f67fe57c0457
parentc17af18f474ba66aaa5fd4542a1bc5accf42be45 (diff)
downloadFreeBSD-src-c1744a5f77132fb6fae2b511901a07de7f2e72c7.zip
FreeBSD-src-c1744a5f77132fb6fae2b511901a07de7f2e72c7.tar.gz
Make the Not RESPONSE in RESPONSE QUEUE message have a bit more info
(specifically, how many entries we've looked at so far). Maintain interrupt instrumentation. Use USEC_SLEEP instead of USEC_DELAY in a number of places (this allows us to drop locks and sleep instead of spin). Track changes to configuration options for topology preference. Fix botched order of printout for Channel, Target, Lun.
-rw-r--r--sys/dev/isp/isp.c50
1 files changed, 36 insertions, 14 deletions
diff --git a/sys/dev/isp/isp.c b/sys/dev/isp/isp.c
index 604e065..8384f37 100644
--- a/sys/dev/isp/isp.c
+++ b/sys/dev/isp/isp.c
@@ -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);
OpenPOWER on IntegriCloud