183 return (NULL);
184
185 len = strlen(nac_name) + 1;
186
187 nac = fmd_hdl_zalloc(hdl, len, FMD_SLEEP);
188 (void) strcpy(nac, nac_name);
189
190 n = cmd_count_components(nac, '/');
191
192 fmd_hdl_debug(hdl, "cmd_mkboard_fru: nac=%s components=%d\n", nac, n);
193
194 hc_list = fmd_hdl_zalloc(hdl, sizeof (nvlist_t *)*n, FMD_SLEEP);
195
196 for (i = 0; i < n; i++) {
197 (void) nvlist_alloc(&hc_list[i],
198 NV_UNIQUE_NAME|NV_UNIQUE_NAME_TYPE, 0);
199 }
200
201 if (cmd_breakup_components(nac, "/", hc_list) < 0) {
202 for (i = 0; i < n; i++) {
203 if (hc_list[i] != NULL)
204 nvlist_free(hc_list[i]);
205 }
206 fmd_hdl_free(hdl, hc_list, sizeof (nvlist_t *)*n);
207 fmd_hdl_free(hdl, nac, len);
208 return (NULL);
209 }
210
211 if (nvlist_alloc(&fru, NV_UNIQUE_NAME, 0) != 0) {
212 for (i = 0; i < n; i++) {
213 if (hc_list[i] != NULL)
214 nvlist_free(hc_list[i]);
215 }
216 fmd_hdl_free(hdl, hc_list, sizeof (nvlist_t *)*n);
217 fmd_hdl_free(hdl, nac, len);
218 return (NULL);
219 }
220
221 if (nvlist_add_uint8(fru, FM_VERSION, FM_HC_SCHEME_VERSION) != 0 ||
222 nvlist_add_string(fru, FM_FMRI_SCHEME, FM_FMRI_SCHEME_HC) != 0 ||
223 nvlist_add_string(fru, FM_FMRI_HC_ROOT, "") != 0 ||
224 nvlist_add_uint32(fru, FM_FMRI_HC_LIST_SZ, n) != 0 ||
225 nvlist_add_nvlist_array(fru, FM_FMRI_HC_LIST, hc_list, n) != 0) {
226 for (i = 0; i < n; i++) {
227 if (hc_list[i] != NULL)
228 nvlist_free(hc_list[i]);
229 }
230 fmd_hdl_free(hdl, hc_list, sizeof (nvlist_t *)*n);
231 fmd_hdl_free(hdl, nac, len);
232 nvlist_free(fru);
233 return (NULL);
234 }
235
236 for (i = 0; i < n; i++) {
237 if (hc_list[i] != NULL)
238 nvlist_free(hc_list[i]);
239 }
240 fmd_hdl_free(hdl, hc_list, sizeof (nvlist_t *)*n);
241 fmd_hdl_free(hdl, nac, len);
242
243 if ((serialstr != NULL &&
244 nvlist_add_string(fru, FM_FMRI_HC_SERIAL_ID, serialstr) != 0) ||
245 (partstr != NULL &&
246 nvlist_add_string(fru, FM_FMRI_HC_PART, partstr) != 0)) {
247 nvlist_free(fru);
248 return (NULL);
249 }
250
251 return (fru);
252 }
253
254 nvlist_t *
255 cmd_boardfru_create_fault(fmd_hdl_t *hdl, nvlist_t *asru, const char *fltnm,
256 uint_t cert, char *loc)
257 {
258 nvlist_t *flt, *nvlfru;
259 char *serialstr, *partstr;
260
261 if ((loc == NULL) || (strcmp(loc, EMPTY_STR) == 0))
262 return (NULL);
263
264 if (nvlist_lookup_string(asru, FM_FMRI_HC_SERIAL_ID, &serialstr) != 0)
265 serialstr = NULL;
266 if (nvlist_lookup_string(asru, FM_FMRI_HC_PART, &partstr) != 0)
267 partstr = NULL;
268
269 nvlfru = cmd_mkboard_fru(hdl, loc, serialstr, partstr);
270 if (nvlfru == NULL)
271 return (NULL);
272
273 flt = cmd_nvl_create_fault(hdl, fltnm, cert, nvlfru, nvlfru, NULL);
274 flt = cmd_fault_add_location(hdl, flt, loc);
275 if (nvlfru != NULL)
276 nvlist_free(nvlfru);
277 return (flt);
278 }
279
280 /* find_mb -- find hardware platform motherboard within libtopo */
281
282 /* ARGSUSED */
283 static int
284 find_mb(topo_hdl_t *thp, tnode_t *node, void *arg)
285 {
286 int err;
287 nvlist_t *rsrc, **hcl;
288 char *name;
289 uint_t n;
290
291 if (topo_node_resource(node, &rsrc, &err) < 0) {
292 return (TOPO_WALK_NEXT); /* no resource, try next */
293 }
294
295 if (nvlist_lookup_nvlist_array(rsrc, FM_FMRI_HC_LIST, &hcl, &n) < 0) {
621 */
622 if ((rsrc != NULL) && strstr(class, ".page") != NULL) {
623 if (nvlist_alloc(&hsp, NV_UNIQUE_NAME, 0) == 0) {
624 if (nvlist_lookup_uint64(asru,
625 FM_FMRI_MEM_PHYSADDR, &phyaddr) == 0)
626 (void) (nvlist_add_uint64(hsp,
627 FM_FMRI_MEM_PHYSADDR,
628 phyaddr));
629
630 if (nvlist_lookup_uint64(asru,
631 FM_FMRI_MEM_OFFSET, &offset) == 0)
632 (void) nvlist_add_uint64(hsp,
633 FM_FMRI_HC_SPECIFIC_OFFSET, offset);
634
635 (void) nvlist_add_nvlist(rsrc,
636 FM_FMRI_HC_SPECIFIC, hsp);
637 }
638 }
639 fllist = fmd_nvl_create_fault(hdl, class, cert, asru,
640 fru, rsrc);
641 if (hsp != NULL)
642 nvlist_free(hsp);
643 } else {
644 rsrc = get_cpu_fault_resource(hdl, asru);
645 fllist = fmd_nvl_create_fault(hdl, class, cert, asru,
646 fru, rsrc);
647 }
648
649 if (rsrc != NULL)
650 nvlist_free(rsrc);
651
652 return (fllist);
653 }
|
183 return (NULL);
184
185 len = strlen(nac_name) + 1;
186
187 nac = fmd_hdl_zalloc(hdl, len, FMD_SLEEP);
188 (void) strcpy(nac, nac_name);
189
190 n = cmd_count_components(nac, '/');
191
192 fmd_hdl_debug(hdl, "cmd_mkboard_fru: nac=%s components=%d\n", nac, n);
193
194 hc_list = fmd_hdl_zalloc(hdl, sizeof (nvlist_t *)*n, FMD_SLEEP);
195
196 for (i = 0; i < n; i++) {
197 (void) nvlist_alloc(&hc_list[i],
198 NV_UNIQUE_NAME|NV_UNIQUE_NAME_TYPE, 0);
199 }
200
201 if (cmd_breakup_components(nac, "/", hc_list) < 0) {
202 for (i = 0; i < n; i++) {
203 nvlist_free(hc_list[i]);
204 }
205 fmd_hdl_free(hdl, hc_list, sizeof (nvlist_t *)*n);
206 fmd_hdl_free(hdl, nac, len);
207 return (NULL);
208 }
209
210 if (nvlist_alloc(&fru, NV_UNIQUE_NAME, 0) != 0) {
211 for (i = 0; i < n; i++) {
212 nvlist_free(hc_list[i]);
213 }
214 fmd_hdl_free(hdl, hc_list, sizeof (nvlist_t *)*n);
215 fmd_hdl_free(hdl, nac, len);
216 return (NULL);
217 }
218
219 if (nvlist_add_uint8(fru, FM_VERSION, FM_HC_SCHEME_VERSION) != 0 ||
220 nvlist_add_string(fru, FM_FMRI_SCHEME, FM_FMRI_SCHEME_HC) != 0 ||
221 nvlist_add_string(fru, FM_FMRI_HC_ROOT, "") != 0 ||
222 nvlist_add_uint32(fru, FM_FMRI_HC_LIST_SZ, n) != 0 ||
223 nvlist_add_nvlist_array(fru, FM_FMRI_HC_LIST, hc_list, n) != 0) {
224 for (i = 0; i < n; i++) {
225 nvlist_free(hc_list[i]);
226 }
227 fmd_hdl_free(hdl, hc_list, sizeof (nvlist_t *)*n);
228 fmd_hdl_free(hdl, nac, len);
229 nvlist_free(fru);
230 return (NULL);
231 }
232
233 for (i = 0; i < n; i++) {
234 nvlist_free(hc_list[i]);
235 }
236 fmd_hdl_free(hdl, hc_list, sizeof (nvlist_t *)*n);
237 fmd_hdl_free(hdl, nac, len);
238
239 if ((serialstr != NULL &&
240 nvlist_add_string(fru, FM_FMRI_HC_SERIAL_ID, serialstr) != 0) ||
241 (partstr != NULL &&
242 nvlist_add_string(fru, FM_FMRI_HC_PART, partstr) != 0)) {
243 nvlist_free(fru);
244 return (NULL);
245 }
246
247 return (fru);
248 }
249
250 nvlist_t *
251 cmd_boardfru_create_fault(fmd_hdl_t *hdl, nvlist_t *asru, const char *fltnm,
252 uint_t cert, char *loc)
253 {
254 nvlist_t *flt, *nvlfru;
255 char *serialstr, *partstr;
256
257 if ((loc == NULL) || (strcmp(loc, EMPTY_STR) == 0))
258 return (NULL);
259
260 if (nvlist_lookup_string(asru, FM_FMRI_HC_SERIAL_ID, &serialstr) != 0)
261 serialstr = NULL;
262 if (nvlist_lookup_string(asru, FM_FMRI_HC_PART, &partstr) != 0)
263 partstr = NULL;
264
265 nvlfru = cmd_mkboard_fru(hdl, loc, serialstr, partstr);
266 if (nvlfru == NULL)
267 return (NULL);
268
269 flt = cmd_nvl_create_fault(hdl, fltnm, cert, nvlfru, nvlfru, NULL);
270 flt = cmd_fault_add_location(hdl, flt, loc);
271 nvlist_free(nvlfru);
272 return (flt);
273 }
274
275 /* find_mb -- find hardware platform motherboard within libtopo */
276
277 /* ARGSUSED */
278 static int
279 find_mb(topo_hdl_t *thp, tnode_t *node, void *arg)
280 {
281 int err;
282 nvlist_t *rsrc, **hcl;
283 char *name;
284 uint_t n;
285
286 if (topo_node_resource(node, &rsrc, &err) < 0) {
287 return (TOPO_WALK_NEXT); /* no resource, try next */
288 }
289
290 if (nvlist_lookup_nvlist_array(rsrc, FM_FMRI_HC_LIST, &hcl, &n) < 0) {
616 */
617 if ((rsrc != NULL) && strstr(class, ".page") != NULL) {
618 if (nvlist_alloc(&hsp, NV_UNIQUE_NAME, 0) == 0) {
619 if (nvlist_lookup_uint64(asru,
620 FM_FMRI_MEM_PHYSADDR, &phyaddr) == 0)
621 (void) (nvlist_add_uint64(hsp,
622 FM_FMRI_MEM_PHYSADDR,
623 phyaddr));
624
625 if (nvlist_lookup_uint64(asru,
626 FM_FMRI_MEM_OFFSET, &offset) == 0)
627 (void) nvlist_add_uint64(hsp,
628 FM_FMRI_HC_SPECIFIC_OFFSET, offset);
629
630 (void) nvlist_add_nvlist(rsrc,
631 FM_FMRI_HC_SPECIFIC, hsp);
632 }
633 }
634 fllist = fmd_nvl_create_fault(hdl, class, cert, asru,
635 fru, rsrc);
636 nvlist_free(hsp);
637 } else {
638 rsrc = get_cpu_fault_resource(hdl, asru);
639 fllist = fmd_nvl_create_fault(hdl, class, cert, asru,
640 fru, rsrc);
641 }
642
643 nvlist_free(rsrc);
644
645 return (fllist);
646 }
|