Change the event log dump on initial boot to use get_event versus

AEN.  This makes the boot messages cleaner.  I now know how this
structure works so I can implement it versus guessing.  Remove the
not ready type code since it is ready now.

I added the time stamp/locale/class so people can parse messages better.
Create a sysctl so that we can set the locale/class level.
This commit is contained in:
Doug Ambrisko 2006-09-07 18:40:49 +00:00
parent 1cda541cf5
commit 47b470b9e3
2 changed files with 117 additions and 68 deletions

View File

@ -31,6 +31,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h> #include <sys/param.h>
#include <sys/systm.h> #include <sys/systm.h>
#include <sys/sysctl.h>
#include <sys/malloc.h> #include <sys/malloc.h>
#include <sys/kernel.h> #include <sys/kernel.h>
#include <sys/poll.h> #include <sys/poll.h>
@ -60,9 +61,7 @@ static int mfi_wait_command(struct mfi_softc *, struct mfi_command *);
static int mfi_get_controller_info(struct mfi_softc *); static int mfi_get_controller_info(struct mfi_softc *);
static int mfi_get_log_state(struct mfi_softc *, static int mfi_get_log_state(struct mfi_softc *,
struct mfi_evt_log_state **); struct mfi_evt_log_state **);
#ifdef NOTYET
static int mfi_get_entry(struct mfi_softc *, int); static int mfi_get_entry(struct mfi_softc *, int);
#endif
static int mfi_dcmd_command(struct mfi_softc *, struct mfi_command **, static int mfi_dcmd_command(struct mfi_softc *, struct mfi_command **,
uint32_t, void **, size_t); uint32_t, void **, size_t);
static void mfi_data_cb(void *, bus_dma_segment_t *, int, int); static void mfi_data_cb(void *, bus_dma_segment_t *, int, int);
@ -83,6 +82,15 @@ static void mfi_complete(struct mfi_softc *, struct mfi_command *);
static int mfi_abort(struct mfi_softc *, struct mfi_command *); static int mfi_abort(struct mfi_softc *, struct mfi_command *);
static int mfi_linux_ioctl_int(struct cdev *, u_long, caddr_t, int, d_thread_t *); static int mfi_linux_ioctl_int(struct cdev *, u_long, caddr_t, int, d_thread_t *);
SYSCTL_NODE(_hw, OID_AUTO, mfi, CTLFLAG_RD, 0, "MFI driver parameters");
static int mfi_event_locale = MFI_EVT_LOCALE_ALL;
SYSCTL_INT(_hw_mfi, OID_AUTO, event_locale, CTLFLAG_RW, &mfi_event_locale,
0, "event message locale");
static int mfi_event_class = MFI_EVT_CLASS_DEBUG;
SYSCTL_INT(_hw_mfi, OID_AUTO, event_class, CTLFLAG_RW, &mfi_event_class,
0, "event message class");
/* Management interface */ /* Management interface */
static d_open_t mfi_open; static d_open_t mfi_open;
static d_close_t mfi_close; static d_close_t mfi_close;
@ -618,8 +626,8 @@ mfi_aen_setup(struct mfi_softc *sc, uint32_t seq_start)
uint32_t seq; uint32_t seq;
class_locale.members.reserved = 0; class_locale.members.reserved = 0;
class_locale.members.locale = MFI_EVT_LOCALE_ALL; class_locale.members.locale = mfi_event_locale;
class_locale.members.class = MFI_EVT_CLASS_DEBUG; class_locale.members.class = mfi_event_class;
if (seq_start == 0) { if (seq_start == 0) {
error = mfi_get_log_state(sc, &log_state); error = mfi_get_log_state(sc, &log_state);
@ -634,14 +642,10 @@ mfi_aen_setup(struct mfi_softc *sc, uint32_t seq_start)
* the AEN mechanism via setting it lower then * the AEN mechanism via setting it lower then
* current. The firmware will iterate through them. * current. The firmware will iterate through them.
*/ */
#ifdef NOTYET
for (seq = log_state->shutdown_seq_num; for (seq = log_state->shutdown_seq_num;
seq <= log_state->newest_seq_num; seq++) { seq <= log_state->newest_seq_num; seq++) {
mfi_get_entry(sc, seq); mfi_get_entry(sc, seq);
} }
#endif
seq = log_state->shutdown_seq_num + 1;
} else } else
seq = seq_start; seq = seq_start;
mfi_aen_register(sc, seq, class_locale.word); mfi_aen_register(sc, seq, class_locale.word);
@ -865,35 +869,26 @@ out:
return; return;
} }
#ifdef NOTYET
static void
mfi_decode_log(struct mfi_softc *sc, struct mfi_log_detail *detail)
{
switch (detail->arg_type) {
default:
device_printf(sc->mfi_dev, "%d - Log entry type %d\n",
detail->seq,
detail->arg_type
);
break;
}
}
#endif
static void static void
mfi_decode_evt(struct mfi_softc *sc, struct mfi_evt_detail *detail) mfi_decode_evt(struct mfi_softc *sc, struct mfi_evt_detail *detail)
{ {
switch (detail->arg_type) { switch (detail->arg_type) {
case MR_EVT_ARGS_NONE: case MR_EVT_ARGS_NONE:
device_printf(sc->mfi_dev, "%d - %s\n", device_printf(sc->mfi_dev, "%d (%us/0x%04x/%d) - %s\n",
detail->seq, detail->seq,
detail->time,
detail->class.members.locale,
detail->class.members.class,
detail->description detail->description
); );
break; break;
case MR_EVT_ARGS_CDB_SENSE: case MR_EVT_ARGS_CDB_SENSE:
device_printf(sc->mfi_dev, "%d - PD %02d(e%d/s%d) CDB %*D" device_printf(sc->mfi_dev, "%d (%us/0x%04x/%d) - PD %02d(e%d/s%d) CDB %*D"
"Sense %*D\n: %s\n", "Sense %*D\n: %s\n",
detail->seq, detail->seq,
detail->time,
detail->class.members.locale,
detail->class.members.class,
detail->args.cdb_sense.pd.device_id, detail->args.cdb_sense.pd.device_id,
detail->args.cdb_sense.pd.enclosure_index, detail->args.cdb_sense.pd.enclosure_index,
detail->args.cdb_sense.pd.slot_number, detail->args.cdb_sense.pd.slot_number,
@ -907,18 +902,24 @@ mfi_decode_evt(struct mfi_softc *sc, struct mfi_evt_detail *detail)
); );
break; break;
case MR_EVT_ARGS_LD: case MR_EVT_ARGS_LD:
device_printf(sc->mfi_dev, "%d - VD %02d/%d " device_printf(sc->mfi_dev, "%d (%us/0x%04x/%d) - VD %02d/%d "
"event: %s\n", "event: %s\n",
detail->seq, detail->seq,
detail->time,
detail->class.members.locale,
detail->class.members.class,
detail->args.ld.ld_index, detail->args.ld.ld_index,
detail->args.ld.target_id, detail->args.ld.target_id,
detail->description detail->description
); );
break; break;
case MR_EVT_ARGS_LD_COUNT: case MR_EVT_ARGS_LD_COUNT:
device_printf(sc->mfi_dev, "%d - VD %02d/%d " device_printf(sc->mfi_dev, "%d (%us/0x%04x/%d) - VD %02d/%d "
"count %lld: %s\n", "count %lld: %s\n",
detail->seq, detail->seq,
detail->time,
detail->class.members.locale,
detail->class.members.class,
detail->args.ld_count.ld.ld_index, detail->args.ld_count.ld.ld_index,
detail->args.ld_count.ld.target_id, detail->args.ld_count.ld.target_id,
(long long)detail->args.ld_count.count, (long long)detail->args.ld_count.count,
@ -926,9 +927,12 @@ mfi_decode_evt(struct mfi_softc *sc, struct mfi_evt_detail *detail)
); );
break; break;
case MR_EVT_ARGS_LD_LBA: case MR_EVT_ARGS_LD_LBA:
device_printf(sc->mfi_dev, "%d - VD %02d/%d " device_printf(sc->mfi_dev, "%d (%us/0x%04x/%d) - VD %02d/%d "
"lba %lld: %s\n", "lba %lld: %s\n",
detail->seq, detail->seq,
detail->time,
detail->class.members.locale,
detail->class.members.class,
detail->args.ld_lba.ld.ld_index, detail->args.ld_lba.ld.ld_index,
detail->args.ld_lba.ld.target_id, detail->args.ld_lba.ld.target_id,
(long long)detail->args.ld_lba.lba, (long long)detail->args.ld_lba.lba,
@ -936,9 +940,12 @@ mfi_decode_evt(struct mfi_softc *sc, struct mfi_evt_detail *detail)
); );
break; break;
case MR_EVT_ARGS_LD_OWNER: case MR_EVT_ARGS_LD_OWNER:
device_printf(sc->mfi_dev, "%d - VD %02d/%d " device_printf(sc->mfi_dev, "%d (%us/0x%04x/%d) - VD %02d/%d "
"owner changed: prior %d, new %d: %s\n", "owner changed: prior %d, new %d: %s\n",
detail->seq, detail->seq,
detail->time,
detail->class.members.locale,
detail->class.members.class,
detail->args.ld_owner.ld.ld_index, detail->args.ld_owner.ld.ld_index,
detail->args.ld_owner.ld.target_id, detail->args.ld_owner.ld.target_id,
detail->args.ld_owner.pre_owner, detail->args.ld_owner.pre_owner,
@ -947,9 +954,12 @@ mfi_decode_evt(struct mfi_softc *sc, struct mfi_evt_detail *detail)
); );
break; break;
case MR_EVT_ARGS_LD_LBA_PD_LBA: case MR_EVT_ARGS_LD_LBA_PD_LBA:
device_printf(sc->mfi_dev, "%d - VD %02d/%d " device_printf(sc->mfi_dev, "%d (%us/0x%04x/%d) - VD %02d/%d "
"lba %lld, physical drive PD %02d(e%d/s%d) lba %lld: %s\n", "lba %lld, physical drive PD %02d(e%d/s%d) lba %lld: %s\n",
detail->seq, detail->seq,
detail->time,
detail->class.members.locale,
detail->class.members.class,
detail->args.ld_lba_pd_lba.ld.ld_index, detail->args.ld_lba_pd_lba.ld.ld_index,
detail->args.ld_lba_pd_lba.ld.target_id, detail->args.ld_lba_pd_lba.ld.target_id,
(long long)detail->args.ld_lba_pd_lba.ld_lba, (long long)detail->args.ld_lba_pd_lba.ld_lba,
@ -961,9 +971,12 @@ mfi_decode_evt(struct mfi_softc *sc, struct mfi_evt_detail *detail)
); );
break; break;
case MR_EVT_ARGS_LD_PROG: case MR_EVT_ARGS_LD_PROG:
device_printf(sc->mfi_dev, "%d - VD %02d/%d " device_printf(sc->mfi_dev, "%d (%us/0x%04x/%d) - VD %02d/%d "
"progress %d%% in %ds: %s\n", "progress %d%% in %ds: %s\n",
detail->seq, detail->seq,
detail->time,
detail->class.members.locale,
detail->class.members.class,
detail->args.ld_prog.ld.ld_index, detail->args.ld_prog.ld.ld_index,
detail->args.ld_prog.ld.target_id, detail->args.ld_prog.ld.target_id,
detail->args.ld_prog.prog.progress/655, detail->args.ld_prog.prog.progress/655,
@ -972,9 +985,12 @@ mfi_decode_evt(struct mfi_softc *sc, struct mfi_evt_detail *detail)
); );
break; break;
case MR_EVT_ARGS_LD_STATE: case MR_EVT_ARGS_LD_STATE:
device_printf(sc->mfi_dev, "%d - VD %02d/%d " device_printf(sc->mfi_dev, "%d (%us/0x%04x/%d) - VD %02d/%d "
"state prior %d new %d: %s\n", "state prior %d new %d: %s\n",
detail->seq, detail->seq,
detail->time,
detail->class.members.locale,
detail->class.members.class,
detail->args.ld_state.ld.ld_index, detail->args.ld_state.ld.ld_index,
detail->args.ld_state.ld.target_id, detail->args.ld_state.ld.target_id,
detail->args.ld_state.prev_state, detail->args.ld_state.prev_state,
@ -983,9 +999,12 @@ mfi_decode_evt(struct mfi_softc *sc, struct mfi_evt_detail *detail)
); );
break; break;
case MR_EVT_ARGS_LD_STRIP: case MR_EVT_ARGS_LD_STRIP:
device_printf(sc->mfi_dev, "%d - VD %02d/%d " device_printf(sc->mfi_dev, "%d (%us/0x%04x/%d) - VD %02d/%d "
"strip %lld: %s\n", "strip %lld: %s\n",
detail->seq, detail->seq,
detail->time,
detail->class.members.locale,
detail->class.members.class,
detail->args.ld_strip.ld.ld_index, detail->args.ld_strip.ld.ld_index,
detail->args.ld_strip.ld.target_id, detail->args.ld_strip.ld.target_id,
(long long)detail->args.ld_strip.strip, (long long)detail->args.ld_strip.strip,
@ -993,9 +1012,12 @@ mfi_decode_evt(struct mfi_softc *sc, struct mfi_evt_detail *detail)
); );
break; break;
case MR_EVT_ARGS_PD: case MR_EVT_ARGS_PD:
device_printf(sc->mfi_dev, "%d - PD %02d(e%d/s%d) " device_printf(sc->mfi_dev, "%d (%us/0x%04x/%d) - PD %02d(e%d/s%d) "
"event: %s\n", "event: %s\n",
detail->seq, detail->seq,
detail->time,
detail->class.members.locale,
detail->class.members.class,
detail->args.pd.device_id, detail->args.pd.device_id,
detail->args.pd.enclosure_index, detail->args.pd.enclosure_index,
detail->args.pd.slot_number, detail->args.pd.slot_number,
@ -1003,9 +1025,12 @@ mfi_decode_evt(struct mfi_softc *sc, struct mfi_evt_detail *detail)
); );
break; break;
case MR_EVT_ARGS_PD_ERR: case MR_EVT_ARGS_PD_ERR:
device_printf(sc->mfi_dev, "%d - PD %02d(e%d/s%d) " device_printf(sc->mfi_dev, "%d (%us/0x%04x/%d) - PD %02d(e%d/s%d) "
"err %d: %s\n", "err %d: %s\n",
detail->seq, detail->seq,
detail->time,
detail->class.members.locale,
detail->class.members.class,
detail->args.pd_err.pd.device_id, detail->args.pd_err.pd.device_id,
detail->args.pd_err.pd.enclosure_index, detail->args.pd_err.pd.enclosure_index,
detail->args.pd_err.pd.slot_number, detail->args.pd_err.pd.slot_number,
@ -1014,9 +1039,12 @@ mfi_decode_evt(struct mfi_softc *sc, struct mfi_evt_detail *detail)
); );
break; break;
case MR_EVT_ARGS_PD_LBA: case MR_EVT_ARGS_PD_LBA:
device_printf(sc->mfi_dev, "%d - PD %02d(e%d/s%d) " device_printf(sc->mfi_dev, "%d (%us/0x%04x/%d) - PD %02d(e%d/s%d) "
"lba %lld: %s\n", "lba %lld: %s\n",
detail->seq, detail->seq,
detail->time,
detail->class.members.locale,
detail->class.members.class,
detail->args.pd_lba.pd.device_id, detail->args.pd_lba.pd.device_id,
detail->args.pd_lba.pd.enclosure_index, detail->args.pd_lba.pd.enclosure_index,
detail->args.pd_lba.pd.slot_number, detail->args.pd_lba.pd.slot_number,
@ -1025,9 +1053,12 @@ mfi_decode_evt(struct mfi_softc *sc, struct mfi_evt_detail *detail)
); );
break; break;
case MR_EVT_ARGS_PD_LBA_LD: case MR_EVT_ARGS_PD_LBA_LD:
device_printf(sc->mfi_dev, "%d - PD %02d(e%d/s%d) " device_printf(sc->mfi_dev, "%d (%us/0x%04x/%d) - PD %02d(e%d/s%d) "
"lba %lld VD %02d/%d: %s\n", "lba %lld VD %02d/%d: %s\n",
detail->seq, detail->seq,
detail->time,
detail->class.members.locale,
detail->class.members.class,
detail->args.pd_lba_ld.pd.device_id, detail->args.pd_lba_ld.pd.device_id,
detail->args.pd_lba_ld.pd.enclosure_index, detail->args.pd_lba_ld.pd.enclosure_index,
detail->args.pd_lba_ld.pd.slot_number, detail->args.pd_lba_ld.pd.slot_number,
@ -1038,9 +1069,12 @@ mfi_decode_evt(struct mfi_softc *sc, struct mfi_evt_detail *detail)
); );
break; break;
case MR_EVT_ARGS_PD_PROG: case MR_EVT_ARGS_PD_PROG:
device_printf(sc->mfi_dev, "%d - PD %02d(e%d/s%d) " device_printf(sc->mfi_dev, "%d (%us/0x%04x/%d) - PD %02d(e%d/s%d) "
"progress %d%% seconds %ds: %s\n", "progress %d%% seconds %ds: %s\n",
detail->seq, detail->seq,
detail->time,
detail->class.members.locale,
detail->class.members.class,
detail->args.pd_prog.pd.device_id, detail->args.pd_prog.pd.device_id,
detail->args.pd_prog.pd.enclosure_index, detail->args.pd_prog.pd.enclosure_index,
detail->args.pd_prog.pd.slot_number, detail->args.pd_prog.pd.slot_number,
@ -1050,9 +1084,12 @@ mfi_decode_evt(struct mfi_softc *sc, struct mfi_evt_detail *detail)
); );
break; break;
case MR_EVT_ARGS_PD_STATE: case MR_EVT_ARGS_PD_STATE:
device_printf(sc->mfi_dev, "%d - PD %02d(e%d/s%d) " device_printf(sc->mfi_dev, "%d (%us/0x%04x/%d) - PD %02d(e%d/s%d) "
"state prior %d new %d: %s\n", "state prior %d new %d: %s\n",
detail->seq, detail->seq,
detail->time,
detail->class.members.locale,
detail->class.members.class,
detail->args.pd_prog.pd.device_id, detail->args.pd_prog.pd.device_id,
detail->args.pd_prog.pd.enclosure_index, detail->args.pd_prog.pd.enclosure_index,
detail->args.pd_prog.pd.slot_number, detail->args.pd_prog.pd.slot_number,
@ -1062,9 +1099,12 @@ mfi_decode_evt(struct mfi_softc *sc, struct mfi_evt_detail *detail)
); );
break; break;
case MR_EVT_ARGS_PCI: case MR_EVT_ARGS_PCI:
device_printf(sc->mfi_dev, "%d - PCI 0x04%x 0x04%x " device_printf(sc->mfi_dev, "%d (%us/0x%04x/%d) - PCI 0x04%x 0x04%x "
"0x04%x 0x04%x: %s\n", "0x04%x 0x04%x: %s\n",
detail->seq, detail->seq,
detail->time,
detail->class.members.locale,
detail->class.members.class,
detail->args.pci.venderId, detail->args.pci.venderId,
detail->args.pci.deviceId, detail->args.pci.deviceId,
detail->args.pci.subVenderId, detail->args.pci.subVenderId,
@ -1073,24 +1113,33 @@ mfi_decode_evt(struct mfi_softc *sc, struct mfi_evt_detail *detail)
); );
break; break;
case MR_EVT_ARGS_RATE: case MR_EVT_ARGS_RATE:
device_printf(sc->mfi_dev, "%d - Rebuild rate %d: %s\n", device_printf(sc->mfi_dev, "%d (%us/0x%04x/%d) - Rebuild rate %d: %s\n",
detail->seq, detail->seq,
detail->time,
detail->class.members.locale,
detail->class.members.class,
detail->args.rate, detail->args.rate,
detail->description detail->description
); );
break; break;
case MR_EVT_ARGS_TIME: case MR_EVT_ARGS_TIME:
device_printf(sc->mfi_dev, "%d - Adapter ticks %d " device_printf(sc->mfi_dev, "%d (%us/0x%04x/%d) - Adapter ticks %d "
"elapsed %ds: %s\n", "elapsed %ds: %s\n",
detail->seq, detail->seq,
detail->time,
detail->class.members.locale,
detail->class.members.class,
detail->args.time.rtc, detail->args.time.rtc,
detail->args.time.elapsedSeconds, detail->args.time.elapsedSeconds,
detail->description detail->description
); );
break; break;
case MR_EVT_ARGS_ECC: case MR_EVT_ARGS_ECC:
device_printf(sc->mfi_dev, "%d - Adapter ECC %x,%x: %s: %s\n", device_printf(sc->mfi_dev, "%d (%us/0x%04x/%d) - Adapter ECC %x,%x: %s: %s\n",
detail->seq, detail->seq,
detail->time,
detail->class.members.locale,
detail->class.members.class,
detail->args.ecc.ecar, detail->args.ecc.ecar,
detail->args.ecc.elog, detail->args.ecc.elog,
detail->args.ecc.str, detail->args.ecc.str,
@ -1098,8 +1147,11 @@ mfi_decode_evt(struct mfi_softc *sc, struct mfi_evt_detail *detail)
); );
break; break;
default: default:
device_printf(sc->mfi_dev, "%d - Type %d: %s\n", device_printf(sc->mfi_dev, "%d (%us/0x%04x/%d) - Type %d: %s\n",
detail->seq, detail->seq,
detail->time,
detail->class.members.locale,
detail->class.members.class,
detail->arg_type, detail->description detail->arg_type, detail->description
); );
} }
@ -1201,14 +1253,17 @@ mfi_aen_complete(struct mfi_command *cm)
} }
} }
#ifdef NOTYET /* Only do one event for now so we can easily iterate through them */
#define MAX_EVENTS 1
static int static int
mfi_get_entry(struct mfi_softc *sc, int seq) mfi_get_entry(struct mfi_softc *sc, int seq)
{ {
struct mfi_command *cm; struct mfi_command *cm;
struct mfi_dcmd_frame *dcmd; struct mfi_dcmd_frame *dcmd;
struct mfi_log_detail *ed; struct mfi_evt_list *el;
int error; int error;
int i;
int size;
mtx_lock(&sc->mfi_io_lock); mtx_lock(&sc->mfi_io_lock);
if ((cm = mfi_dequeue_free(sc)) == NULL) { if ((cm = mfi_dequeue_free(sc)) == NULL) {
@ -1217,8 +1272,10 @@ mfi_get_entry(struct mfi_softc *sc, int seq)
} }
mtx_unlock(&sc->mfi_io_lock); mtx_unlock(&sc->mfi_io_lock);
ed = malloc(sizeof(struct mfi_log_detail), M_MFIBUF, M_NOWAIT | M_ZERO); size = sizeof(struct mfi_evt_list) + sizeof(struct mfi_evt_detail)
if (ed == NULL) { * (MAX_EVENTS - 1);
el = malloc(size, M_MFIBUF, M_NOWAIT | M_ZERO);
if (el == NULL) {
mtx_lock(&sc->mfi_io_lock); mtx_lock(&sc->mfi_io_lock);
mfi_release_command(cm); mfi_release_command(cm);
mtx_unlock(&sc->mfi_io_lock); mtx_unlock(&sc->mfi_io_lock);
@ -1229,19 +1286,19 @@ mfi_get_entry(struct mfi_softc *sc, int seq)
bzero(dcmd->mbox, MFI_MBOX_SIZE); bzero(dcmd->mbox, MFI_MBOX_SIZE);
dcmd->header.cmd = MFI_CMD_DCMD; dcmd->header.cmd = MFI_CMD_DCMD;
dcmd->header.timeout = 0; dcmd->header.timeout = 0;
dcmd->header.data_len = sizeof(struct mfi_log_detail); dcmd->header.data_len = size;
dcmd->opcode = MFI_DCMD_CTRL_EVENT_GET; dcmd->opcode = MFI_DCMD_CTRL_EVENT_GET;
((uint32_t *)&dcmd->mbox)[0] = seq; ((uint32_t *)&dcmd->mbox)[0] = seq;
((uint32_t *)&dcmd->mbox)[1] = MFI_EVT_LOCALE_ALL; ((uint32_t *)&dcmd->mbox)[1] = MFI_EVT_LOCALE_ALL;
cm->cm_sg = &dcmd->sgl; cm->cm_sg = &dcmd->sgl;
cm->cm_total_frame_size = MFI_DCMD_FRAME_SIZE; cm->cm_total_frame_size = MFI_DCMD_FRAME_SIZE;
cm->cm_flags = MFI_CMD_DATAIN | MFI_CMD_POLLED; cm->cm_flags = MFI_CMD_DATAIN | MFI_CMD_POLLED;
cm->cm_data = ed; cm->cm_data = el;
cm->cm_len = sizeof(struct mfi_evt_detail); cm->cm_len = size;
if ((error = mfi_mapcmd(sc, cm)) != 0) { if ((error = mfi_mapcmd(sc, cm)) != 0) {
device_printf(sc->mfi_dev, "Controller info buffer map failed"); device_printf(sc->mfi_dev, "Controller info buffer map failed");
free(ed, M_MFIBUF); free(el, M_MFIBUF);
mfi_release_command(cm); mfi_release_command(cm);
return (error); return (error);
} }
@ -1250,7 +1307,7 @@ mfi_get_entry(struct mfi_softc *sc, int seq)
device_printf(sc->mfi_dev, "Failed to get controller entry\n"); device_printf(sc->mfi_dev, "Failed to get controller entry\n");
sc->mfi_max_io = (sc->mfi_total_sgl - 1) * PAGE_SIZE / sc->mfi_max_io = (sc->mfi_total_sgl - 1) * PAGE_SIZE /
MFI_SECTOR_LEN; MFI_SECTOR_LEN;
free(ed, M_MFIBUF); free(el, M_MFIBUF);
mfi_release_command(cm); mfi_release_command(cm);
return (0); return (0);
} }
@ -1259,7 +1316,9 @@ mfi_get_entry(struct mfi_softc *sc, int seq)
BUS_DMASYNC_POSTREAD); BUS_DMASYNC_POSTREAD);
bus_dmamap_unload(sc->mfi_buffer_dmat, cm->cm_dmamap); bus_dmamap_unload(sc->mfi_buffer_dmat, cm->cm_dmamap);
mfi_decode_log(sc, ed); for (i = 0; i < el->count; i++) {
mfi_decode_evt(sc, &el->event[0]);
}
mtx_lock(&sc->mfi_io_lock); mtx_lock(&sc->mfi_io_lock);
free(cm->cm_data, M_MFIBUF); free(cm->cm_data, M_MFIBUF);
@ -1267,7 +1326,6 @@ mfi_get_entry(struct mfi_softc *sc, int seq)
mtx_unlock(&sc->mfi_io_lock); mtx_unlock(&sc->mfi_io_lock);
return (0); return (0);
} }
#endif
static int static int
mfi_add_ld(struct mfi_softc *sc, int id) mfi_add_ld(struct mfi_softc *sc, int id)

View File

@ -715,19 +715,10 @@ struct mfi_evt_detail {
char description[128]; char description[128];
} __packed; } __packed;
/* SAS log detail guessed at */ struct mfi_evt_list {
struct mfi_log_detail { uint32_t count;
uint32_t something1; uint32_t reserved;
uint32_t something2; struct mfi_evt_detail event[1];
uint32_t seq;
uint32_t something3;
uint32_t arg_type;
uint8_t reserved1[15];
union {
uint8_t b[96];
} args;
char description[128];
} __packed; } __packed;
struct mfi_ldref { struct mfi_ldref {