summaryrefslogtreecommitdiffstats
path: root/sys/dev/mpr/mpr.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/mpr/mpr.c')
-rw-r--r--sys/dev/mpr/mpr.c65
1 files changed, 44 insertions, 21 deletions
diff --git a/sys/dev/mpr/mpr.c b/sys/dev/mpr/mpr.c
index 72edf46..f988e79 100644
--- a/sys/dev/mpr/mpr.c
+++ b/sys/dev/mpr/mpr.c
@@ -381,7 +381,7 @@ mpr_iocfacts_allocate(struct mpr_softc *sc, uint8_t attaching)
}
}
- mpr_print_iocfacts(sc, sc->facts);
+ MPR_DPRINT_PAGE(sc, MPR_XINFO, iocfacts, sc->facts);
snprintf(sc->fw_version, sizeof(sc->fw_version),
"%02d.%02d.%02d.%02d",
@@ -436,6 +436,8 @@ mpr_iocfacts_allocate(struct mpr_softc *sc, uint8_t attaching)
/* Only deallocate and reallocate if relevant IOC Facts have changed */
reallocating = FALSE;
+ sc->mpr_flags &= ~MPR_FLAGS_REALLOCATED;
+
if ((!attaching) &&
((saved_facts.MsgVersion != sc->facts->MsgVersion) ||
(saved_facts.HeaderVersion != sc->facts->HeaderVersion) ||
@@ -458,6 +460,9 @@ mpr_iocfacts_allocate(struct mpr_softc *sc, uint8_t attaching)
(saved_facts.MaxPersistentEntries !=
sc->facts->MaxPersistentEntries))) {
reallocating = TRUE;
+
+ /* Record that we reallocated everything */
+ sc->mpr_flags |= MPR_FLAGS_REALLOCATED;
}
/*
@@ -1482,7 +1487,7 @@ mpr_init_queues(struct mpr_softc *sc)
* Next are the global settings, if they exist. Highest are the per-unit
* settings, if they exist.
*/
-static void
+void
mpr_get_tunables(struct mpr_softc *sc)
{
char tmpstr[80];
@@ -1658,8 +1663,6 @@ mpr_attach(struct mpr_softc *sc)
{
int error;
- mpr_get_tunables(sc);
-
MPR_FUNCTRACE(sc);
mtx_init(&sc->mpr_mtx, "MPR lock", NULL, MTX_DEF);
@@ -1774,7 +1777,7 @@ mpr_log_evt_handler(struct mpr_softc *sc, uintptr_t data,
{
MPI2_EVENT_DATA_LOG_ENTRY_ADDED *entry;
- mpr_print_event(sc, event);
+ MPR_DPRINT_EVENT(sc, generic, event);
switch (event->Event) {
case MPI2_EVENT_LOG_DATA:
@@ -2189,7 +2192,7 @@ mpr_reregister_events_complete(struct mpr_softc *sc, struct mpr_command *cm)
mpr_dprint(sc, MPR_TRACE, "%s\n", __func__);
if (cm->cm_reply)
- mpr_print_event(sc,
+ MPR_DPRINT_EVENT(sc, generic,
(MPI2_EVENT_NOTIFICATION_REPLY *)cm->cm_reply);
mpr_free_command(sc, cm);
@@ -2231,8 +2234,8 @@ mpr_update_events(struct mpr_softc *sc, struct mpr_event_handle *handle,
uint8_t *mask)
{
MPI2_EVENT_NOTIFICATION_REQUEST *evtreq;
- MPI2_EVENT_NOTIFICATION_REPLY *reply;
- struct mpr_command *cm;
+ MPI2_EVENT_NOTIFICATION_REPLY *reply = NULL;
+ struct mpr_command *cm = NULL;
struct mpr_event_handle *eh;
int error, i;
@@ -2265,18 +2268,20 @@ mpr_update_events(struct mpr_softc *sc, struct mpr_event_handle *handle,
cm->cm_desc.Default.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE;
cm->cm_data = NULL;
- error = mpr_request_polled(sc, cm);
- reply = (MPI2_EVENT_NOTIFICATION_REPLY *)cm->cm_reply;
+ error = mpr_request_polled(sc, &cm);
+ if (cm != NULL)
+ reply = (MPI2_EVENT_NOTIFICATION_REPLY *)cm->cm_reply;
if ((reply == NULL) ||
(reply->IOCStatus & MPI2_IOCSTATUS_MASK) != MPI2_IOCSTATUS_SUCCESS)
error = ENXIO;
if (reply)
- mpr_print_event(sc, reply);
+ MPR_DPRINT_EVENT(sc, generic, reply);
mpr_dprint(sc, MPR_TRACE, "%s finished error %d\n", __func__, error);
- mpr_free_command(sc, cm);
+ if (cm != NULL)
+ mpr_free_command(sc, cm);
return (error);
}
@@ -3262,11 +3267,12 @@ mpr_map_command(struct mpr_softc *sc, struct mpr_command *cm)
* be executed and enqueued automatically. Other errors come from msleep().
*/
int
-mpr_wait_command(struct mpr_softc *sc, struct mpr_command *cm, int timeout,
+mpr_wait_command(struct mpr_softc *sc, struct mpr_command **cmp, int timeout,
int sleep_flag)
{
int error, rc;
struct timeval cur_time, start_time;
+ struct mpr_command *cm = *cmp;
if (sc->mpr_flags & MPR_FLAGS_DIAGRESET)
return EBUSY;
@@ -3321,6 +3327,13 @@ mpr_wait_command(struct mpr_softc *sc, struct mpr_command *cm, int timeout,
rc = mpr_reinit(sc);
mpr_dprint(sc, MPR_FAULT, "Reinit %s\n", (rc == 0) ? "success" :
"failed");
+ if (sc->mpr_flags & MPR_FLAGS_REALLOCATED) {
+ /*
+ * Tell the caller that we freed the command in a
+ * reinit.
+ */
+ *cmp = NULL;
+ }
error = ETIMEDOUT;
}
return (error);
@@ -3331,10 +3344,11 @@ mpr_wait_command(struct mpr_softc *sc, struct mpr_command *cm, int timeout,
* completion. Its use should be rare.
*/
int
-mpr_request_polled(struct mpr_softc *sc, struct mpr_command *cm)
+mpr_request_polled(struct mpr_softc *sc, struct mpr_command **cmp)
{
- int error, timeout = 0, rc;
+ int error, rc;
struct timeval cur_time, start_time;
+ struct mpr_command *cm = *cmp;
error = 0;
@@ -3342,7 +3356,7 @@ mpr_request_polled(struct mpr_softc *sc, struct mpr_command *cm)
cm->cm_complete = NULL;
mpr_map_command(sc, cm);
- getmicrotime(&start_time);
+ getmicrouptime(&start_time);
while ((cm->cm_flags & MPR_CM_FLAGS_COMPLETE) == 0) {
mpr_intr_locked(sc);
@@ -3355,9 +3369,9 @@ mpr_request_polled(struct mpr_softc *sc, struct mpr_command *cm)
/*
* Check for real-time timeout and fail if more than 60 seconds.
*/
- getmicrotime(&cur_time);
- timeout = cur_time.tv_sec - start_time.tv_sec;
- if (timeout > 60) {
+ getmicrouptime(&cur_time);
+ timevalsub(&cur_time, &start_time);
+ if (cur_time.tv_sec > 60) {
mpr_dprint(sc, MPR_FAULT, "polling failed\n");
error = ETIMEDOUT;
break;
@@ -3369,6 +3383,14 @@ mpr_request_polled(struct mpr_softc *sc, struct mpr_command *cm)
rc = mpr_reinit(sc);
mpr_dprint(sc, MPR_FAULT, "Reinit %s\n", (rc == 0) ? "success" :
"failed");
+
+ if (sc->mpr_flags & MPR_FLAGS_REALLOCATED) {
+ /*
+ * Tell the caller that we freed the command in a
+ * reinit.
+ */
+ *cmp = NULL;
+ }
}
return (error);
}
@@ -3434,11 +3456,12 @@ mpr_read_config_page(struct mpr_softc *sc, struct mpr_config_params *params)
cm->cm_complete = mpr_config_complete;
return (mpr_map_command(sc, cm));
} else {
- error = mpr_wait_command(sc, cm, 0, CAN_SLEEP);
+ error = mpr_wait_command(sc, &cm, 0, CAN_SLEEP);
if (error) {
mpr_dprint(sc, MPR_FAULT,
"Error %d reading config page\n", error);
- mpr_free_command(sc, cm);
+ if (cm != NULL)
+ mpr_free_command(sc, cm);
return (error);
}
mpr_config_complete(sc, cm);
OpenPOWER on IntegriCloud