diff options
author | mjacob <mjacob@FreeBSD.org> | 2000-01-03 23:52:41 +0000 |
---|---|---|
committer | mjacob <mjacob@FreeBSD.org> | 2000-01-03 23:52:41 +0000 |
commit | 29617705118780742c351451d21157a7e7ab3b3a (patch) | |
tree | e40ef035a07f8f8a9f7314d43de1b944cff2d66b | |
parent | c4a59d8a778958d8ff091ef31e19f4e1768a5bbd (diff) | |
download | FreeBSD-src-29617705118780742c351451d21157a7e7ab3b3a.zip FreeBSD-src-29617705118780742c351451d21157a7e7ab3b3a.tar.gz |
Raise default FCP logintime to 60 seconds. Move the position
of where we could have seen the loop up at least once so it
makes sense. Change some stuff in ispscsicmd so we don't get
stuck there if the loop has never come up yet. Add in some
target mode support code.
-rw-r--r-- | sys/dev/isp/isp.c | 74 |
1 files changed, 53 insertions, 21 deletions
diff --git a/sys/dev/isp/isp.c b/sys/dev/isp/isp.c index e2a3bf6..966574e 100644 --- a/sys/dev/isp/isp.c +++ b/sys/dev/isp/isp.c @@ -1007,7 +1007,6 @@ isp_fibre_init(isp) #else fcp->isp_fwoptions = 0; #endif - fcp->isp_fwoptions |= ICBOPT_FAIRNESS; /* * If this is a 2100 < revision 5, we have to turn off FAIRNESS. @@ -1059,7 +1058,7 @@ isp_fibre_init(isp) icbp->icb_retry_delay = fcp->isp_retry_delay; icbp->icb_retry_count = fcp->isp_retry_count; icbp->icb_hardaddr = loopid; - icbp->icb_logintime = 30; /* 30 second login timeout */ + icbp->icb_logintime = 60; /* 60 second login timeout */ if (fcp->isp_nodewwn) { u_int64_t pn; @@ -1332,7 +1331,6 @@ isp_fclink_test(isp, waitdelay) CFGPRINTF("%s: Loop ID %d, ALPA 0x%x Loop State 0x%x topology %s\n", isp->isp_name, fcp->isp_loopid, fcp->isp_alpa, fcp->isp_loopstate, tname); - fcp->loop_seen_once = 1; return (0); } @@ -1394,6 +1392,7 @@ isp_pdb_sync(isp, target) * FL_PORT_ID times). */ tport = fcp->tport; + /* * make sure the temp port database is clean... */ @@ -1466,7 +1465,7 @@ isp_pdb_sync(isp, target) * use) and then compare it to our saved database which * never shifts. */ - if (isp_same_lportdb(lp, &fcp->portdb[target])) { + if (target >= 0 && isp_same_lportdb(lp, &fcp->portdb[target])) { lp->valid = 1; } } @@ -1758,6 +1757,12 @@ isp_pdb_sync(isp, target) isp_mboxcmd(isp, &mbs); } #endif + /* + * If we get here, we've for sure seen not only a valid loop + * but know what is or isn't on it, so mark this for usage + * in ispscsicmd. + */ + fcp->loop_seen_once = 1; return (0); } @@ -1908,11 +1913,17 @@ ispscsicmd(xs) * If our loop state is such that we haven't yet received * a "Port Database Changed" notification (after a LIP or * a Loop Reset or firmware initialization), then defer - * sending commands for a little while. + * sending commands for a little while, but only if we've + * seen a valid loop at one point (otherwise we can get + * stuck at initialization time). */ if (fcp->isp_loopstate < LOOP_PDB_RCVD) { XS_SETERR(xs, HBA_SELTIMEOUT); - return (CMD_RQLATER); + if (fcp->loop_seen_once) { + return (CMD_RQLATER); + } else { + return (CMD_COMPLETE); + } } /* @@ -2192,12 +2203,25 @@ isp_control(isp, ctl, arg) case ISPCTL_FCLINK_TEST: return (isp_fclink_test(isp, FC_FW_READY_DELAY)); -#ifdef ISP_TARGET_MODE - case ISPCTL_ENABLE_LUN: - return (isp_modify_lun, 1, arg)); - case ISPCTL_MODIFY_LUN: - return (isp_modify_lun, 0, arg)); + case ISPCTL_PDB_SYNC: + return (isp_pdb_sync(isp, -1)); + +#ifdef ISP_TARGET_MODE + case ISPCTL_TOGGLE_TMODE: + if (IS_SCSI(isp)) { + int ena = *(int *)arg; + mbs.param[0] = MBOX_ENABLE_TARGET_MODE; + mbs.param[1] = (ena)? ENABLE_TARGET_FLAG : 0; + isp_mboxcmd(isp, &mbs); + if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { + PRINTF("%s: cannot %sable target mode (0x%x)\n", + isp->isp_name, ena? "en" : "dis", + mbs.param[0]); + break; + } + } + return (0); #endif } return (-1); @@ -2289,12 +2313,12 @@ isp_intr(arg) MemoryBarrier(); /* * Do any appropriate unswizzling of what the Qlogic f/w has - * written into memory so it makes sense to us. + * written into memory so it makes sense to us. This is a + * per-platform thing. */ ISP_UNSWIZZLE_RESPONSE(isp, sp); if (sp->req_header.rqs_entry_type != RQSTYPE_RESPONSE) { if (isp_handle_other_response(isp, sp, &optr) == 0) { - ISP_WRITE(isp, INMAILBOX5, optr); continue; } /* @@ -2303,7 +2327,6 @@ isp_intr(arg) * not, something bad has happened. */ if (sp->req_header.rqs_entry_type != RQSTYPE_REQUEST) { - ISP_WRITE(isp, INMAILBOX5, optr); PRINTF("%s: not RESPONSE in RESPONSE Queue " "(type 0x%x) @ idx %d (next %d)\n", isp->isp_name, @@ -2506,7 +2529,7 @@ isp_parse_async(isp, mbox) case ASYNC_BUS_RESET: isp->isp_sendmarker = (1 << bus); #ifdef ISP_TARGET_MODE - isp_target_async(isp, bus, ASYNC_BUS_RESET); + isp_target_async(isp, bus, mbox); #endif isp_async(isp, ISPASYNC_BUS_RESET, &bus); break; @@ -2540,7 +2563,7 @@ isp_parse_async(isp, mbox) isp->isp_name, bus); isp->isp_sendmarker = (1 << bus); #ifdef ISP_TARGET_MODE - isp_target_async(isp, bus, ASYNC_TIMEOUT_RESET); + isp_target_async(isp, bus, mbox); #endif break; @@ -2548,7 +2571,7 @@ isp_parse_async(isp, mbox) PRINTF("%s: device reset on bus %d\n", isp->isp_name, bus); isp->isp_sendmarker = 1 << bus; #ifdef ISP_TARGET_MODE - isp_target_async(isp, bus, ASYNC_DEVICE_RESET); + isp_target_async(isp, bus, mbox); #endif break; @@ -2626,6 +2649,9 @@ isp_parse_async(isp, mbox) isp->isp_sendmarker = 1; isp_mark_getpdb_all(isp); IDPRINTF(1, ("%s: LIP occurred\n", isp->isp_name)); +#ifdef ISP_TARGET_MODE + isp_target_async(isp, bus, mbox); +#endif break; case ASYNC_LOOP_UP: @@ -2634,6 +2660,9 @@ isp_parse_async(isp, mbox) ((fcparam *) isp->isp_param)->isp_loopstate = LOOP_LIP_RCVD; isp_mark_getpdb_all(isp); isp_async(isp, ISPASYNC_LOOP_UP, NULL); +#ifdef ISP_TARGET_MODE + isp_target_async(isp, bus, mbox); +#endif break; case ASYNC_LOOP_DOWN: @@ -2642,6 +2671,9 @@ isp_parse_async(isp, mbox) ((fcparam *) isp->isp_param)->isp_loopstate = LOOP_NIL; isp_mark_getpdb_all(isp); isp_async(isp, ISPASYNC_LOOP_DOWN, NULL); +#ifdef ISP_TARGET_MODE + isp_target_async(isp, bus, mbox); +#endif break; case ASYNC_LOOP_RESET: @@ -2651,7 +2683,7 @@ isp_parse_async(isp, mbox) isp_mark_getpdb_all(isp); PRINTF("%s: Loop RESET\n", isp->isp_name); #ifdef ISP_TARGET_MODE - isp_target_async(isp, bus, ASYNC_LOOP_RESET); + isp_target_async(isp, bus, mbox); #endif break; @@ -2692,7 +2724,7 @@ isp_handle_other_response(isp, sp, optrp) { switch (sp->req_header.rqs_entry_type) { case RQSTYPE_ATIO: - case RQSTYPE_CTIO0: + case RQSTYPE_CTIO: case RQSTYPE_ENABLE_LUN: case RQSTYPE_MODIFY_LUN: case RQSTYPE_NOTIFY: @@ -2702,7 +2734,7 @@ isp_handle_other_response(isp, sp, optrp) case RQSTYPE_CTIO2: case RQSTYPE_CTIO3: #ifdef ISP_TARGET_MODE - return (isp_target_entry(isp, sp)); + return (isp_target_notify(isp, sp, optrp)); #else /* FALLTHROUGH */ #endif @@ -3094,7 +3126,7 @@ static u_int8_t mbpcnt[] = { MAKNIB(0, 0), /* 0x52: */ MAKNIB(0, 0), /* 0x53: */ MAKNIB(8, 0), /* 0x54: MBOX_EXEC_COMMAND_IOCB_A64 */ - MAKNIB(0, 0), /* 0x55: */ + MAKNIB(2, 1), /* 0x55: MBOX_ENABLE_TARGET_MODE */ MAKNIB(0, 0), /* 0x56: */ MAKNIB(0, 0), /* 0x57: */ MAKNIB(0, 0), /* 0x58: */ |