static void branch_free(fmd_hdl_t *hdl, cmd_branch_t *branch, int destroy) { fmd_hdl_debug(hdl, "Free branch %s\n", branch->branch_unum); if (branch->branch_case.cc_cp != NULL) { if (destroy) { if (branch->branch_case.cc_serdnm != NULL) { fmd_serd_destroy(hdl, branch->branch_case.cc_serdnm); fmd_hdl_strfree(hdl, branch->branch_case.cc_serdnm); branch->branch_case.cc_serdnm = NULL; } } cmd_case_fini(hdl, branch->branch_case.cc_cp, destroy); } branch_dimmlist_free(hdl, branch); cmd_fmri_fini(hdl, &branch->branch_asru, destroy); if (destroy) fmd_buf_destroy(hdl, NULL, branch->branch_bufname); cmd_list_delete(&cmd.cmd_branches, branch); fmd_hdl_free(hdl, branch, sizeof (cmd_branch_t)); }
static void cmd_dimm_free(fmd_hdl_t *hdl, cmd_dimm_t *dimm, int destroy) { cmd_case_t *cc = &dimm->dimm_case; #ifdef sun4v cmd_branch_t *branch; #endif if (cc->cc_cp != NULL) { cmd_case_fini(hdl, cc->cc_cp, destroy); if (cc->cc_serdnm != NULL) { if (fmd_serd_exists(hdl, cc->cc_serdnm) && destroy) fmd_serd_destroy(hdl, cc->cc_serdnm); fmd_hdl_strfree(hdl, cc->cc_serdnm); } } if (dimm->dimm_bank != NULL) cmd_bank_remove_dimm(hdl, dimm->dimm_bank, dimm); #ifdef sun4v branch = cmd_branch_lookup_by_unum(hdl, dimm->dimm_unum); if (branch != NULL) cmd_branch_remove_dimm(hdl, branch, dimm); #endif cmd_fmri_fini(hdl, &dimm->dimm_asru, destroy); if (destroy) fmd_buf_destroy(hdl, NULL, dimm->dimm_bufname); cmd_list_delete(&cmd.cmd_dimms, dimm); fmd_hdl_free(hdl, dimm, sizeof (cmd_dimm_t)); }
static void branch_dimmlist_free(fmd_hdl_t *hdl, cmd_branch_t *branch) { cmd_branch_memb_t *bm; while ((bm = cmd_list_next(&branch->branch_dimms)) != NULL) { cmd_list_delete(&branch->branch_dimms, bm); fmd_hdl_free(hdl, bm, sizeof (cmd_branch_memb_t)); } }
void cmd_branch_remove_dimm(fmd_hdl_t *hdl, cmd_branch_t *branch, cmd_dimm_t *dimm) { cmd_branch_memb_t *bm; fmd_hdl_debug(hdl, "Detaching dimm %s from branch %s\n", dimm->dimm_unum, branch->branch_unum); for (bm = cmd_list_next(&branch->branch_dimms); bm != NULL; bm = cmd_list_next(bm)) { if (bm->dimm == dimm) { cmd_list_delete(&branch->branch_dimms, bm); fmd_hdl_free(hdl, bm, sizeof (cmd_branch_memb_t)); return; } } fmd_hdl_abort(hdl, "Attempt to disconnect dimm from non-parent branch\n"); }
void cmd_dimm_destroy(fmd_hdl_t *hdl, cmd_dimm_t *dimm) { int i; cmd_mq_t *q; for (i = 0; i < CMD_MAX_CKWDS; i++) { while ((q = cmd_list_next(&dimm->mq_root[i])) != NULL) { if (q->mq_serdnm != NULL) { if (fmd_serd_exists(hdl, q->mq_serdnm)) { fmd_serd_destroy(hdl, q->mq_serdnm); } fmd_hdl_strfree(hdl, q->mq_serdnm); q->mq_serdnm = NULL; } cmd_list_delete(&dimm->mq_root[i], q); fmd_hdl_free(hdl, q, sizeof (cmd_mq_t)); } } fmd_stat_destroy(hdl, 1, &(dimm->dimm_retstat)); cmd_dimm_free(hdl, dimm, FMD_B_TRUE); }