summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormjacob <mjacob@FreeBSD.org>2001-06-14 17:13:24 +0000
committermjacob <mjacob@FreeBSD.org>2001-06-14 17:13:24 +0000
commit1c41b07fa5158bd854f75b029650f76216a4915f (patch)
tree5d6ba01421b751dd04a5d15ccd9c19e55261b97f
parent65ed101d3ca9a6904711608c3e602218a4cdafc5 (diff)
downloadFreeBSD-src-1c41b07fa5158bd854f75b029650f76216a4915f.zip
FreeBSD-src-1c41b07fa5158bd854f75b029650f76216a4915f.tar.gz
We've had problems with data corruption occuring on
commands that complete (with no apparent error) after we receive a LIP. This has been observed mostly on Local Loop topologies. To be safe, let's just mark all active commands as dead if we get a LIP and we're on a private or public loop. MFC after: 4 weeks
-rw-r--r--sys/dev/isp/isp.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/sys/dev/isp/isp.c b/sys/dev/isp/isp.c
index 6680fc4..5b3090b 100644
--- a/sys/dev/isp/isp.c
+++ b/sys/dev/isp/isp.c
@@ -3347,6 +3347,27 @@ isp_parse_async(struct ispsoftc *isp, int mbox)
#ifdef ISP_TARGET_MODE
isp_target_async(isp, bus, mbox);
#endif
+ /*
+ * We've had problems with data corruption occuring on
+ * commands that complete (with no apparent error) after
+ * we receive a LIP. This has been observed mostly on
+ * Local Loop topologies. To be safe, let's just mark
+ * all active commands as dead.
+ */
+ if (FCPARAM(isp)->isp_topo == TOPO_NL_PORT ||
+ FCPARAM(isp)->isp_topo == TOPO_FL_PORT) {
+ int i, j;
+ for (i = j = 0; i < isp->isp_maxcmds; i++) {
+ XS_T *xs;
+ xs = isp->isp_xflist[i];
+ if (xs != NULL) {
+ j++;
+ XS_SETERR(xs, HBA_BUSRESET);
+ }
+ }
+ isp_prt(isp, ISP_LOGERR,
+ "LIP destroyed %d active commands", j);
+ }
break;
case ASYNC_LOOP_UP:
OpenPOWER on IntegriCloud