349 goto error;
350
351 listp = nvf_list(hdl);
352 for (pua = list_head(listp); pua != NULL;
353 pua = list_next(listp, pua)) {
354 (void) snprintf(buf, sizeof (buf), "%d", pua->pua_index);
355 rval = nvlist_add_int32(sub_nvl, buf, pua->pua_addr);
356 if (rval != DDI_SUCCESS)
357 goto error;
358 }
359
360 rval = nvlist_add_nvlist(nvl, "table", sub_nvl);
361 if (rval != DDI_SUCCESS)
362 goto error;
363 nvlist_free(sub_nvl);
364
365 *ret_nvl = nvl;
366 return (DDI_SUCCESS);
367
368 error:
369 if (sub_nvl)
370 nvlist_free(sub_nvl);
371 ASSERT(nvl);
372 nvlist_free(nvl);
373 *ret_nvl = NULL;
374 return (DDI_FAILURE);
375 }
376
377 static void
378 pci_cache_free_list(nvf_handle_t hdl)
379 {
380 list_t *listp;
381 pua_node_t *pua;
382
383 ASSERT(RW_WRITE_HELD(nvf_lock(hdl)));
384
385 listp = nvf_list(hdl);
386 for (pua = list_head(listp); pua != NULL;
387 pua = list_next(listp, pua)) {
388 list_remove(listp, pua);
389 kmem_free(pua, sizeof (pua_node_t));
|
349 goto error;
350
351 listp = nvf_list(hdl);
352 for (pua = list_head(listp); pua != NULL;
353 pua = list_next(listp, pua)) {
354 (void) snprintf(buf, sizeof (buf), "%d", pua->pua_index);
355 rval = nvlist_add_int32(sub_nvl, buf, pua->pua_addr);
356 if (rval != DDI_SUCCESS)
357 goto error;
358 }
359
360 rval = nvlist_add_nvlist(nvl, "table", sub_nvl);
361 if (rval != DDI_SUCCESS)
362 goto error;
363 nvlist_free(sub_nvl);
364
365 *ret_nvl = nvl;
366 return (DDI_SUCCESS);
367
368 error:
369 nvlist_free(sub_nvl);
370 ASSERT(nvl);
371 nvlist_free(nvl);
372 *ret_nvl = NULL;
373 return (DDI_FAILURE);
374 }
375
376 static void
377 pci_cache_free_list(nvf_handle_t hdl)
378 {
379 list_t *listp;
380 pua_node_t *pua;
381
382 ASSERT(RW_WRITE_HELD(nvf_lock(hdl)));
383
384 listp = nvf_list(hdl);
385 for (pua = list_head(listp); pua != NULL;
386 pua = list_next(listp, pua)) {
387 list_remove(listp, pua);
388 kmem_free(pua, sizeof (pua_node_t));
|