diff options
author | mjacob <mjacob@FreeBSD.org> | 2001-06-14 17:13:24 +0000 |
---|---|---|
committer | mjacob <mjacob@FreeBSD.org> | 2001-06-14 17:13:24 +0000 |
commit | 1c41b07fa5158bd854f75b029650f76216a4915f (patch) | |
tree | 5d6ba01421b751dd04a5d15ccd9c19e55261b97f /sys/dev | |
parent | 65ed101d3ca9a6904711608c3e602218a4cdafc5 (diff) | |
download | FreeBSD-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
Diffstat (limited to 'sys/dev')
-rw-r--r-- | sys/dev/isp/isp.c | 21 |
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: |