nvlist_t * cmd_boardfru_create_fault(fmd_hdl_t *hdl, nvlist_t *asru, const char *fltnm, uint_t cert, char *loc) { nvlist_t *flt, *nvlfru; char *serialstr, *partstr; if ((loc == NULL) || (strcmp(loc, EMPTY_STR) == 0)) return (NULL); if (nvlist_lookup_string(asru, FM_FMRI_HC_SERIAL_ID, &serialstr) != 0) serialstr = NULL; if (nvlist_lookup_string(asru, FM_FMRI_HC_PART, &partstr) != 0) partstr = NULL; nvlfru = cmd_mkboard_fru(hdl, loc, serialstr, partstr); if (nvlfru == NULL) return (NULL); flt = cmd_nvl_create_fault(hdl, fltnm, cert, nvlfru, nvlfru, NULL); flt = cmd_fault_add_location(hdl, flt, loc); if (nvlfru != NULL) nvlist_free(nvlfru); return (flt); }
nvlist_t * cmd_dimm_create_fault(fmd_hdl_t *hdl, cmd_dimm_t *dimm, const char *fltnm, uint_t cert) { #ifdef sun4v nvlist_t *flt, *nvlfru; /* * Do NOT issue hc scheme FRU FMRIs for ultraSPARC-T1 platforms. * The SP will misinterpret the FRU. Instead, reuse the ASRU FMRI * * Use the BR string as a distinguisher. BR (branch) is only * present in ultraSPARC-T2/T2plus DIMM unums */ if (strstr(dimm->dimm_unum, "BR") == NULL) { flt = cmd_nvl_create_fault(hdl, fltnm, cert, dimm->dimm_asru_nvl, dimm->dimm_asru_nvl, NULL); } else { nvlfru = cmd_mem2hc(hdl, dimm->dimm_asru_nvl); flt = cmd_nvl_create_fault(hdl, fltnm, cert, dimm->dimm_asru_nvl, nvlfru, NULL); if (nvlfru != NULL) nvlist_free(nvlfru); } return (cmd_fault_add_location(hdl, flt, dimm->dimm_unum)); #else return (cmd_nvl_create_fault(hdl, fltnm, cert, dimm->dimm_asru_nvl, dimm->dimm_asru_nvl, NULL)); #endif /* sun4v */ }
static void add_bdflt_to_case(fmd_hdl_t *hdl, char *label, const char *fltnm, uint8_t board_cert, fmd_case_t *cp) { nvlist_t *memb_nvl, *flt; memb_nvl = fru_by_label(hdl, label); if (memb_nvl != NULL) { flt = cmd_nvl_create_fault(hdl, fltnm, board_cert, memb_nvl, memb_nvl, NULL); flt = cmd_fault_add_location(hdl, flt, label); if (flt != NULL) { fmd_case_add_suspect(hdl, cp, flt); } nvlist_free(memb_nvl); } }