438 /* Pull parts of ereport together into ereport. */
439 fm_ereport_set(ereport, version, class, ena, detector, NULL);
440
441 /* Merge any preconstructed payload into the event. */
442 if (pl)
443 (void) nvlist_merge(ereport, pl, 0);
444
445 /* Add any remaining (after version) varargs payload to ereport. */
446 name = va_arg(ap, char *);
447 (void) i_fm_payload_set(ereport, name, ap);
448
449 /* Post the ereport. */
450 if (nva)
451 errorq_commit(fmhdl->fh_errorq, eqep, ERRORQ_ASYNC);
452 else
453 fm_ereport_post(ereport, EVCH_SLEEP);
454 goto out;
455
456 /* Count errors as drops. */
457 err: if (fmhdl)
458 atomic_add_64(&fmhdl->fh_kstat.fek_erpt_dropped.value.ui64, 1);
459
460 /* Free up nvlists if normal interfaces were used to allocate memory */
461 out: if (ereport && (nva == NULL))
462 fm_nvlist_destroy(ereport, FM_NVA_FREE);
463 if (detector && (nva == NULL))
464 fm_nvlist_destroy(detector, FM_NVA_FREE);
465 }
466
467 /*
468 * Generate an error report for consumption by the Solaris Fault Manager,
469 * fmd(1M). Valid ereport classes are defined in /usr/include/sys/fm/io.
470 *
471 * The ENA should be set if this error is a result of an error status
472 * returned from ddi_dma_err_check() or ddi_acc_err_check(). Otherwise,
473 * an ENA value of 0 is appropriate.
474 *
475 * If sflag == DDI_NOSLEEP, ddi_fm_ereport_post () may be called
476 * from user, kernel, interrupt or high-interrupt context. Otherwise,
477 * ddi_fm_ereport_post() must be called from user or kernel context.
478 *
1002 }
1003
1004 errp = &((ddi_dma_impl_t *)handle)->dmai_error;
1005
1006 errp->err_status = DDI_FM_OK;
1007 errp->err_ena = 0;
1008 errp->err_expected = DDI_FM_ERR_UNEXPECTED;
1009 }
1010
1011 void
1012 i_ddi_fm_acc_err_set(ddi_acc_handle_t handle, uint64_t ena, int status,
1013 int flag)
1014 {
1015 ddi_acc_hdl_t *hdlp = impl_acc_hdl_get(handle);
1016 ddi_acc_impl_t *i_hdlp = (ddi_acc_impl_t *)handle;
1017 struct i_ddi_fmhdl *fmhdl = DEVI(hdlp->ah_dip)->devi_fmhdl;
1018
1019 i_hdlp->ahi_err->err_ena = ena;
1020 i_hdlp->ahi_err->err_status = status;
1021 i_hdlp->ahi_err->err_expected = flag;
1022 atomic_add_64(&fmhdl->fh_kstat.fek_acc_err.value.ui64, 1);
1023 }
1024
1025 void
1026 i_ddi_fm_dma_err_set(ddi_dma_handle_t handle, uint64_t ena, int status,
1027 int flag)
1028 {
1029 ddi_dma_impl_t *hdlp = (ddi_dma_impl_t *)handle;
1030 struct i_ddi_fmhdl *fmhdl = DEVI(hdlp->dmai_rdip)->devi_fmhdl;
1031
1032 hdlp->dmai_error.err_ena = ena;
1033 hdlp->dmai_error.err_status = status;
1034 hdlp->dmai_error.err_expected = flag;
1035 atomic_add_64(&fmhdl->fh_kstat.fek_dma_err.value.ui64, 1);
1036 }
1037
1038 ddi_fmcompare_t
1039 i_ddi_fm_acc_err_cf_get(ddi_acc_handle_t handle)
1040 {
1041 ddi_acc_impl_t *i_hdlp = (ddi_acc_impl_t *)handle;
1042
1043 return (i_hdlp->ahi_err->err_cf);
1044 }
1045
1046 ddi_fmcompare_t
1047 i_ddi_fm_dma_err_cf_get(ddi_dma_handle_t handle)
1048 {
1049 ddi_dma_impl_t *hdlp = (ddi_dma_impl_t *)handle;
1050
1051 return (hdlp->dmai_error.err_cf);
1052 }
|
438 /* Pull parts of ereport together into ereport. */
439 fm_ereport_set(ereport, version, class, ena, detector, NULL);
440
441 /* Merge any preconstructed payload into the event. */
442 if (pl)
443 (void) nvlist_merge(ereport, pl, 0);
444
445 /* Add any remaining (after version) varargs payload to ereport. */
446 name = va_arg(ap, char *);
447 (void) i_fm_payload_set(ereport, name, ap);
448
449 /* Post the ereport. */
450 if (nva)
451 errorq_commit(fmhdl->fh_errorq, eqep, ERRORQ_ASYNC);
452 else
453 fm_ereport_post(ereport, EVCH_SLEEP);
454 goto out;
455
456 /* Count errors as drops. */
457 err: if (fmhdl)
458 atomic_inc_64(&fmhdl->fh_kstat.fek_erpt_dropped.value.ui64);
459
460 /* Free up nvlists if normal interfaces were used to allocate memory */
461 out: if (ereport && (nva == NULL))
462 fm_nvlist_destroy(ereport, FM_NVA_FREE);
463 if (detector && (nva == NULL))
464 fm_nvlist_destroy(detector, FM_NVA_FREE);
465 }
466
467 /*
468 * Generate an error report for consumption by the Solaris Fault Manager,
469 * fmd(1M). Valid ereport classes are defined in /usr/include/sys/fm/io.
470 *
471 * The ENA should be set if this error is a result of an error status
472 * returned from ddi_dma_err_check() or ddi_acc_err_check(). Otherwise,
473 * an ENA value of 0 is appropriate.
474 *
475 * If sflag == DDI_NOSLEEP, ddi_fm_ereport_post () may be called
476 * from user, kernel, interrupt or high-interrupt context. Otherwise,
477 * ddi_fm_ereport_post() must be called from user or kernel context.
478 *
1002 }
1003
1004 errp = &((ddi_dma_impl_t *)handle)->dmai_error;
1005
1006 errp->err_status = DDI_FM_OK;
1007 errp->err_ena = 0;
1008 errp->err_expected = DDI_FM_ERR_UNEXPECTED;
1009 }
1010
1011 void
1012 i_ddi_fm_acc_err_set(ddi_acc_handle_t handle, uint64_t ena, int status,
1013 int flag)
1014 {
1015 ddi_acc_hdl_t *hdlp = impl_acc_hdl_get(handle);
1016 ddi_acc_impl_t *i_hdlp = (ddi_acc_impl_t *)handle;
1017 struct i_ddi_fmhdl *fmhdl = DEVI(hdlp->ah_dip)->devi_fmhdl;
1018
1019 i_hdlp->ahi_err->err_ena = ena;
1020 i_hdlp->ahi_err->err_status = status;
1021 i_hdlp->ahi_err->err_expected = flag;
1022 atomic_inc_64(&fmhdl->fh_kstat.fek_acc_err.value.ui64);
1023 }
1024
1025 void
1026 i_ddi_fm_dma_err_set(ddi_dma_handle_t handle, uint64_t ena, int status,
1027 int flag)
1028 {
1029 ddi_dma_impl_t *hdlp = (ddi_dma_impl_t *)handle;
1030 struct i_ddi_fmhdl *fmhdl = DEVI(hdlp->dmai_rdip)->devi_fmhdl;
1031
1032 hdlp->dmai_error.err_ena = ena;
1033 hdlp->dmai_error.err_status = status;
1034 hdlp->dmai_error.err_expected = flag;
1035 atomic_inc_64(&fmhdl->fh_kstat.fek_dma_err.value.ui64);
1036 }
1037
1038 ddi_fmcompare_t
1039 i_ddi_fm_acc_err_cf_get(ddi_acc_handle_t handle)
1040 {
1041 ddi_acc_impl_t *i_hdlp = (ddi_acc_impl_t *)handle;
1042
1043 return (i_hdlp->ahi_err->err_cf);
1044 }
1045
1046 ddi_fmcompare_t
1047 i_ddi_fm_dma_err_cf_get(ddi_dma_handle_t handle)
1048 {
1049 ddi_dma_impl_t *hdlp = (ddi_dma_impl_t *)handle;
1050
1051 return (hdlp->dmai_error.err_cf);
1052 }
|