aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/mpr
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/mpr')
-rw-r--r--sys/dev/mpr/mpr.c23
-rw-r--r--sys/dev/mpr/mpr_sas.c3
-rw-r--r--sys/dev/mpr/mpr_sas_lsi.c3
3 files changed, 20 insertions, 9 deletions
diff --git a/sys/dev/mpr/mpr.c b/sys/dev/mpr/mpr.c
index d5c02f9608ca..d1c572e40669 100644
--- a/sys/dev/mpr/mpr.c
+++ b/sys/dev/mpr/mpr.c
@@ -1195,7 +1195,7 @@ mpr_get_iocfacts(struct mpr_softc *sc, MPI2_IOC_FACTS_REPLY *facts)
{
MPI2_DEFAULT_REPLY *reply;
MPI2_IOC_FACTS_REQUEST request;
- int error, req_sz, reply_sz;
+ int error, req_sz, reply_sz, retry = 0;
MPR_FUNCTRACE(sc);
mpr_dprint(sc, MPR_INIT, "%s entered\n", __func__);
@@ -1204,13 +1204,26 @@ mpr_get_iocfacts(struct mpr_softc *sc, MPI2_IOC_FACTS_REPLY *facts)
reply_sz = sizeof(MPI2_IOC_FACTS_REPLY);
reply = (MPI2_DEFAULT_REPLY *)facts;
+ /*
+ * Retry sending the initialization sequence. Sometimes, especially with
+ * older firmware, the initialization process fails. Retrying allows the
+ * error to clear in the firmware.
+ */
bzero(&request, req_sz);
request.Function = MPI2_FUNCTION_IOC_FACTS;
- error = mpr_request_sync(sc, &request, reply, req_sz, reply_sz, 5);
-
- adjust_iocfacts_endianness(facts);
- mpr_dprint(sc, MPR_TRACE, "facts->IOCCapabilities 0x%x\n", facts->IOCCapabilities);
+ while (retry < 5) {
+ error = mpr_request_sync(sc, &request, reply, req_sz, reply_sz, 5);
+ if (error == 0)
+ break;
+ mpr_dprint(sc, MPR_FAULT, "%s failed retry %d\n", __func__, retry);
+ DELAY(1000);
+ retry++;
+ }
+ if (error == 0) {
+ adjust_iocfacts_endianness(facts);
+ mpr_dprint(sc, MPR_TRACE, "facts->IOCCapabilities 0x%x\n", facts->IOCCapabilities);
+ }
mpr_dprint(sc, MPR_INIT, "%s exit, error= %d\n", __func__, error);
return (error);
}
diff --git a/sys/dev/mpr/mpr_sas.c b/sys/dev/mpr/mpr_sas.c
index 048b3cb7a53d..5f3a27a468b0 100644
--- a/sys/dev/mpr/mpr_sas.c
+++ b/sys/dev/mpr/mpr_sas.c
@@ -51,13 +51,12 @@
#include <sys/kthread.h>
#include <sys/taskqueue.h>
#include <sys/sbuf.h>
+#include <sys/stdarg.h>
#include <machine/bus.h>
#include <machine/resource.h>
#include <sys/rman.h>
-#include <machine/stdarg.h>
-
#include <cam/cam.h>
#include <cam/cam_ccb.h>
#include <cam/cam_debug.h>
diff --git a/sys/dev/mpr/mpr_sas_lsi.c b/sys/dev/mpr/mpr_sas_lsi.c
index 766473370dca..d9744b1054c2 100644
--- a/sys/dev/mpr/mpr_sas_lsi.c
+++ b/sys/dev/mpr/mpr_sas_lsi.c
@@ -51,13 +51,12 @@
#include <sys/taskqueue.h>
#include <sys/sbuf.h>
#include <sys/reboot.h>
+#include <sys/stdarg.h>
#include <machine/bus.h>
#include <machine/resource.h>
#include <sys/rman.h>
-#include <machine/stdarg.h>
-
#include <cam/cam.h>
#include <cam/cam_ccb.h>
#include <cam/cam_debug.h>