diff options
Diffstat (limited to 'sys/dev/mpr')
-rw-r--r-- | sys/dev/mpr/mpr.c | 23 | ||||
-rw-r--r-- | sys/dev/mpr/mpr_sas.c | 3 | ||||
-rw-r--r-- | sys/dev/mpr/mpr_sas_lsi.c | 3 |
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> |