PERFORCE change 106221 for review
Matt Jacob
mjacob at FreeBSD.org
Sat Sep 16 13:12:34 PDT 2006
http://perforce.freebsd.org/chv.cgi?CH=106221
Change 106221 by mjacob at newisp on 2006/09/16 20:12:26
Add a slightly tighter interpretation of 'loop down' such that
we have a 'quick boot' time limit (loop down count when we're
booting) and a 'running' time limit (loop down count when we've
seen loop up once).
Affected files ...
.. //depot/projects/newisp/dev/isp/isp_freebsd.c#7 edit
.. //depot/projects/newisp/dev/isp/isp_freebsd.h#5 edit
.. //depot/projects/newisp/dev/isp/isp_library.c#6 edit
Differences ...
==== //depot/projects/newisp/dev/isp/isp_freebsd.c#7 (text+ko) ====
@@ -45,6 +45,7 @@
int isp_announced = 0;
int isp_fabric_hysteresis = 5;
int isp_loop_down_limit = 300; /* default loop down limit */
+int isp_quickboot_time = 5; /* don't wait more than N secs for loop up */
static d_ioctl_t ispioctl;
static void isp_intr_enable(void *);
@@ -2083,12 +2084,33 @@
isp_prt(isp, ISP_LOGDEBUG0, "kthread: checking FC state");
lb = isp_fc_runstate(isp, 250000);
- isp->isp_osinfo.ktmature = 1;
if (lb) {
unsigned int inc = 1;
- isp_prt(isp, ISP_LOGDEBUG0, "kthread: FC state %d", lb);
- if (isp->isp_osinfo.loop_down_time > 30) {
+ if (lb < 0) {
+ isp_prt(isp, ISP_LOGDEBUG0,
+ "kthread: FC loop not up (down count %d)",
+ isp->isp_osinfo.loop_down_time);
+ } else {
+ isp_prt(isp, ISP_LOGDEBUG0,
+ "kthread: FC got to %d (down count %d)",
+ lb, isp->isp_osinfo.loop_down_time);
+ }
+
+
+ /*
+ * If we've never seen loop up and we've waited longer
+ * than quickboot time, give up and go to sleep until
+ * loop comes up. Otherwise, increment the loop down
+ * time and figure out how long to sleep to the next
+ * check.
+ */
+ if (FCPARAM(isp)->loop_seen_once == 0 &&
+ isp->isp_osinfo.loop_down_time >=
+ isp_quickboot_time) {
+ isp->isp_osinfo.loop_down_time = 0xffff;
+ slp = 0;
+ } else if (isp->isp_osinfo.loop_down_time > 30) {
inc = 30;
slp = 30 * hz;
} else if (isp->isp_osinfo.loop_down_time > 1) {
@@ -2235,14 +2257,10 @@
*/
KASSERT((IS_FC(isp)), ("CMD_RQLATER for FC only"));
/*
- * If we've never seen loop up and we've at least
- * looked once, just fail these commands. Also,
- * if we've exceeded the loop down limit- fail them
- * as well.
+ * If we've exceeded the loop down limit start
+ * failing commands.
*/
- if ((FCPARAM(isp)->loop_seen_once == 0 &&
- isp->isp_osinfo.ktmature) ||
- isp->isp_osinfo.loop_down_time >
+ if (isp->isp_osinfo.loop_down_time >
isp->isp_osinfo.loop_down_limit) {
ISPLOCK_2_CAMLOCK(isp);
XS_SETERR(ccb, CAM_SEL_TIMEOUT);
==== //depot/projects/newisp/dev/isp/isp_freebsd.h#5 (text+ko) ====
@@ -156,7 +156,7 @@
hysteresis : 8,
disabled : 1,
fcbsy : 1,
- ktmature : 1,
+ : 1,
mboxwaiting : 1,
intsok : 1,
simqfrozen : 3;
@@ -433,6 +433,7 @@
extern int isp_announced;
extern int isp_fabric_hysteresis;
extern int isp_loop_down_limit;
+extern int isp_quickboot_time;
/*
* Platform private flags
==== //depot/projects/newisp/dev/isp/isp_library.c#6 (text) ====
@@ -193,10 +193,6 @@
fcparam *fcp;
int *tptr;
- if (IS_SCSI(isp)) {
- isp_prt(isp, ISP_LOGERR, "isp_fc_runstate for SCSI card?");
- return (-1);
- }
fcp = FCPARAM(isp);
tptr = &tval;
if (fcp->isp_fwstate < FW_READY ||
@@ -215,16 +211,16 @@
}
if (isp_control(isp, ISPCTL_SCAN_LOOP, NULL) != 0) {
isp_prt(isp, ISP_LOGINFO, "isp_fc_runstate: scan loop fails");
- return (-1);
+ return (LOOP_PDB_RCVD);
}
if (isp_control(isp, ISPCTL_SCAN_FABRIC, NULL) != 0) {
isp_prt(isp, ISP_LOGINFO,
"isp_fc_runstate: scan fabric fails");
- return (-1);
+ return (LOOP_LSCAN_DONE);
}
if (isp_control(isp, ISPCTL_PDB_SYNC, NULL) != 0) {
isp_prt(isp, ISP_LOGINFO, "isp_fc_runstate: pdb_sync fails");
- return (-1);
+ return (LOOP_FSCAN_DONE);
}
if (fcp->isp_fwstate != FW_READY || fcp->isp_loopstate != LOOP_READY) {
isp_prt(isp, ISP_LOGINFO,
More information about the p4-projects
mailing list