summaryrefslogtreecommitdiffstats
path: root/sys/dev/isp/isp.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/isp/isp.c')
-rw-r--r--sys/dev/isp/isp.c29
1 files changed, 25 insertions, 4 deletions
diff --git a/sys/dev/isp/isp.c b/sys/dev/isp/isp.c
index 8f0ddaa..cfae85f 100644
--- a/sys/dev/isp/isp.c
+++ b/sys/dev/isp/isp.c
@@ -1250,9 +1250,20 @@ isp_fibre_init(struct ispsoftc *isp)
}
#ifndef ISP_NO_RIO_FC
- if ((isp->isp_role & ISP_ROLE_TARGET) == 0 &&
- ((IS_2100(isp) && ISP_FW_REVX(isp->isp_fwrev) >=
- ISP_FW_REV(1, 17, 0)) || IS_2200(isp) || IS_23XX(isp))) {
+ /*
+ * RIO seems to be enabled in 2100s for fw >= 1.17.0.
+ *
+ * I've had some questionable problems with RIO on 2200.
+ * More specifically, on a 2204 I had problems with RIO
+ * on a Linux system where I was dropping commands right
+ * and left. It's not clear to me what the actual problem
+ * was, but it seems safer to only support this on the
+ * 23XX cards.
+ *
+ * I have it disabled if we support a target mode role for
+ * reasons I can't now remember.
+ */
+ if ((isp->isp_role & ISP_ROLE_TARGET) == 0 && IS_23XX(isp)) {
icbp->icb_xfwoptions |= ICBXOPT_RIO_16BIT;
icbp->icb_racctimer = 4;
icbp->icb_idelaytimer = 8;
@@ -3189,8 +3200,17 @@ again:
isp->isp_fpcchiwater = rio.req_header.rqs_seqno;
continue;
} else {
+ /*
+ * Somebody reachable via isp_handle_other_response
+ * may have updated the response queue pointers for
+ * us.
+ */
+ oop = optr;
if (!isp_handle_other_response(isp, type, hp, &optr)) {
MEMZERO(hp, QENTRY_LEN); /* PERF */
+ if (oop != optr) {
+ goto out;
+ }
continue;
}
@@ -3410,7 +3430,7 @@ again:
if (nlooked) {
WRITE_RESPONSE_QUEUE_OUT_POINTER(isp, optr);
/*
- * While we're at it, reqad the requst queue out pointer.
+ * While we're at it, read the requst queue out pointer.
*/
isp->isp_reqodx = READ_REQUEST_QUEUE_OUT_POINTER(isp);
if (isp->isp_rscchiwater < ndone)
@@ -3418,6 +3438,7 @@ again:
}
isp->isp_residx = optr;
+out:
for (i = 0; i < ndone; i++) {
xs = complist[i];
if (xs) {
OpenPOWER on IntegriCloud