#include <OpenIPMI/ipmi_types.h>#include <OpenIPMI/ipmi_bits.h>#include <time.h>Go to the source code of this file.
|
|
Definition at line 500 of file ipmi_fru.h. Referenced by fru_decode_board_info_area(), fru_encode_board_info_area(), and get_fru_by_name(). |
|
|
Definition at line 499 of file ipmi_fru.h. Referenced by fru_decode_chassis_info_area(), fru_encode_chassis_info_area(), and get_fru_by_name(). |
|
|
Definition at line 498 of file ipmi_fru.h. Referenced by fru_decode_internal_use_area(), fru_encode_internal_use_area(), and get_fru_by_name(). |
|
|
|
Definition at line 503 of file ipmi_fru.h. Referenced by check_rec_position(), fru_areainfo(), fru_cleanup_recs(), fru_write(), fru_write_complete(), ipmi_fru_add_area(), ipmi_fru_area_get_length(), ipmi_fru_area_get_offset(), ipmi_fru_area_get_used_length(), ipmi_fru_area_set_length(), ipmi_fru_area_set_offset(), ipmi_fru_delete_area(), and process_fru_info(). |
|
|
Definition at line 501 of file ipmi_fru.h. Referenced by fru_decode_product_info_area(), fru_encode_product_info_area(), and get_fru_by_name(). |
|
|
Definition at line 41 of file ipmi_fru.h. Referenced by for_each_fru_handler(), fru_area_add(), fru_area_delete(), fru_area_length(), fru_area_offset(), fru_areainfo(), fru_deleted(), fru_info(), fru_list_handler(), fru_setval(), fru_written(), and ipmi_cmdlang_dump_fru_info(). |
|
|
Definition at line 88 of file ipmi_fru.h. |
|
|
Definition at line 107 of file ipmi_fru.h. |
|
|
Definition at line 72 of file ipmi_fru.h. |
|
|
Definition at line 59 of file ipmi_fru.h. |
|
|
Definition at line 116 of file ipmi_fru.h. |
|
|
Definition at line 47 of file ipmi_fru.h. 00048 { 00049 IPMI_FRU_DATA_INT, 00050 IPMI_FRU_DATA_TIME, 00051 IPMI_FRU_DATA_ASCII, 00052 IPMI_FRU_DATA_BINARY, 00053 IPMI_FRU_DATA_UNICODE, 00054 IPMI_FRU_DATA_BOOLEAN, 00055 IPMI_FRU_DATA_FLOAT, 00056 IPMI_FRU_DATA_SUB_NODE, 00057 };
|
|
||||||||||||||||||||||||||||||||||||||||||||
|
Definition at line 529 of file fru.c. References _ipmi_fru_unlock(), ipmi_fru_s::domain_fetched_handler, ipmi_fru_s::fetched_cb_data, ipmi_fru_s::fetched_handler, fru_attr_destroy(), fru_attr_init(), frul, ipmi_fru_s::in_frulist, ipmi_domain_attr_get_data(), ipmi_domain_attr_put(), ipmi_domain_register_attribute(), IPMI_FRU_ALL_AREA_MASK, ipmi_fru_alloc_internal(), IPMI_FRU_ATTR_NAME, ipmi_fru_destroy(), locked_list_add_nolock(), locked_list_lock(), and locked_list_unlock(). Referenced by domain_fru(). 00539 { 00540 ipmi_fru_t *nfru; 00541 int rv; 00542 ipmi_domain_attr_t *attr; 00543 locked_list_t *frul; 00544 00545 rv = ipmi_domain_register_attribute(domain, IPMI_FRU_ATTR_NAME, 00546 fru_attr_init, 00547 fru_attr_destroy, 00548 NULL, 00549 &attr); 00550 if (rv) 00551 return rv; 00552 frul = ipmi_domain_attr_get_data(attr); 00553 00554 /* Be careful with locking, a FRU fetch is already going on when 00555 the alloc_internal function returns. */ 00556 locked_list_lock(frul); 00557 rv = ipmi_fru_alloc_internal(domain, is_logical, device_address, 00558 device_id, lun, private_bus, channel, 00559 IPMI_FRU_ALL_AREA_MASK, NULL, NULL, &nfru); 00560 if (rv) { 00561 locked_list_unlock(frul); 00562 ipmi_domain_attr_put(attr); 00563 return rv; 00564 } 00565 00566 nfru->in_frulist = 1; 00567 00568 if (! locked_list_add_nolock(frul, nfru, NULL)) { 00569 locked_list_unlock(frul); 00570 nfru->fetched_handler = NULL; 00571 ipmi_fru_destroy(nfru, NULL, NULL); 00572 ipmi_domain_attr_put(attr); 00573 return ENOMEM; 00574 } 00575 nfru->domain_fetched_handler = fetched_handler; 00576 nfru->fetched_cb_data = fetched_cb_data; 00577 _ipmi_fru_unlock(nfru); 00578 locked_list_unlock(frul); 00579 ipmi_domain_attr_put(attr); 00580 00581 if (new_fru) 00582 *new_fru = nfru; 00583 return 0; 00584 }
|
|
||||||||||||||||||||
|
Definition at line 2239 of file normal_fru.c. References _ipmi_fru_get_rec_data(), _ipmi_fru_is_normal_fru(), _ipmi_fru_lock(), _ipmi_fru_unlock(), ipmi_fru_record_s::changed, check_rec_position(), fru_area_info_s::empty_length, fru_record_alloc(), fru_setup_min_field(), normal_fru_rec_data_s::header_changed, IPMI_FRU_FTR_NUMBER, ipmi_fru_record_s::length, normal_fru_get_recs(), ipmi_fru_record_s::offset, ipmi_fru_record_s::orig_used_length, ipmi_fru_record_s::rewrite, setup_normal_fru(), and ipmi_fru_record_s::used_length. Referenced by fru_area_add(). 02243 { 02244 normal_fru_rec_data_t *info = _ipmi_fru_get_rec_data(fru); 02245 ipmi_fru_record_t **recs; 02246 ipmi_fru_record_t *rec; 02247 int rv; 02248 02249 if (area >= IPMI_FRU_FTR_NUMBER) 02250 return EINVAL; 02251 02252 if (!_ipmi_fru_is_normal_fru(fru)) { 02253 /* This was not a normal FRU. Convert it over to a normal one. */ 02254 info = setup_normal_fru(fru, 1); 02255 if (!info) 02256 return ENOMEM; 02257 } 02258 02259 /* Truncate the length to a multiple of 8. */ 02260 length = length & ~(8-1); 02261 02262 _ipmi_fru_lock(fru); 02263 recs = normal_fru_get_recs(fru); 02264 if (recs[area]) { 02265 _ipmi_fru_unlock(fru); 02266 return EEXIST; 02267 } 02268 02269 rv = check_rec_position(fru, area, offset, length); 02270 if (rv) { 02271 _ipmi_fru_unlock(fru); 02272 return rv; 02273 } 02274 02275 rec = fru_record_alloc(area); 02276 if (!rec) { 02277 _ipmi_fru_unlock(fru); 02278 return ENOMEM; 02279 } 02280 rec->changed = 1; 02281 rec->rewrite = 1; 02282 rec->used_length = fru_area_info[area].empty_length; 02283 rec->orig_used_length = rec->used_length; 02284 rec->offset = offset; 02285 rec->length = length; 02286 info->header_changed = 1; 02287 02288 rv = fru_setup_min_field(rec, area, 1); 02289 if (rv) { 02290 _ipmi_fru_unlock(fru); 02291 return rv; 02292 } 02293 02294 recs[area] = rec; 02295 _ipmi_fru_unlock(fru); 02296 return 0; 02297 }
|
|
||||||||||||||||||||||||||||||||||||||||||||
|
Definition at line 587 of file fru.c. References _ipmi_fru_unlock(), ipmi_fru_s::fetched_handler, fru_attr_destroy(), fru_attr_init(), frul, ipmi_fru_s::in_frulist, ipmi_domain_attr_get_data(), ipmi_domain_attr_put(), ipmi_domain_register_attribute(), IPMI_FRU_ALL_AREA_MASK, ipmi_fru_alloc_internal(), IPMI_FRU_ATTR_NAME, ipmi_fru_destroy(), locked_list_add_nolock(), locked_list_lock(), and locked_list_unlock(). Referenced by dump_fru_cmder(). 00597 { 00598 ipmi_fru_t *nfru; 00599 int rv; 00600 ipmi_domain_attr_t *attr; 00601 locked_list_t *frul; 00602 00603 rv = ipmi_domain_register_attribute(domain, IPMI_FRU_ATTR_NAME, 00604 fru_attr_init, 00605 fru_attr_destroy, 00606 NULL, 00607 &attr); 00608 if (rv) 00609 return rv; 00610 frul = ipmi_domain_attr_get_data(attr); 00611 00612 /* Be careful with locking, a FRU fetch is already going on when 00613 the alloc_internal function returns. */ 00614 locked_list_lock(frul); 00615 rv = ipmi_fru_alloc_internal(domain, is_logical, device_address, 00616 device_id, lun, private_bus, channel, 00617 IPMI_FRU_ALL_AREA_MASK, 00618 fetched_handler, fetched_cb_data, &nfru); 00619 if (rv) { 00620 ipmi_domain_attr_put(attr); 00621 locked_list_unlock(frul); 00622 return rv; 00623 } 00624 00625 nfru->in_frulist = 1; 00626 00627 if (! locked_list_add_nolock(frul, nfru, NULL)) { 00628 locked_list_unlock(frul); 00629 nfru->fetched_handler = NULL; 00630 ipmi_fru_destroy(nfru, NULL, NULL); 00631 ipmi_domain_attr_put(attr); 00632 return ENOMEM; 00633 } 00634 _ipmi_fru_unlock(nfru); 00635 locked_list_unlock(frul); 00636 ipmi_domain_attr_put(attr); 00637 00638 if (new_fru) 00639 *new_fru = nfru; 00640 return 0; 00641 }
|
|
||||||||||||||||
|
Definition at line 2344 of file normal_fru.c. References _ipmi_fru_is_normal_fru(), _ipmi_fru_lock(), _ipmi_fru_unlock(), IPMI_FRU_FTR_NUMBER, ipmi_fru_record_s::length, and normal_fru_get_recs(). Referenced by fru_areainfo(). 02347 { 02348 ipmi_fru_record_t **recs; 02349 02350 if (!_ipmi_fru_is_normal_fru(fru)) 02351 return ENOSYS; 02352 02353 if (area >= IPMI_FRU_FTR_NUMBER) 02354 return EINVAL; 02355 02356 _ipmi_fru_lock(fru); 02357 recs = normal_fru_get_recs(fru); 02358 if (!recs[area]) { 02359 _ipmi_fru_unlock(fru); 02360 return ENOENT; 02361 } 02362 02363 *length = recs[area]->length; 02364 02365 _ipmi_fru_unlock(fru); 02366 return 0; 02367 }
|
|
||||||||||||||||
|
Definition at line 2319 of file normal_fru.c. References _ipmi_fru_is_normal_fru(), _ipmi_fru_lock(), _ipmi_fru_unlock(), IPMI_FRU_FTR_NUMBER, normal_fru_get_recs(), and ipmi_fru_record_s::offset. Referenced by fru_areainfo(). 02322 { 02323 ipmi_fru_record_t **recs; 02324 02325 if (!_ipmi_fru_is_normal_fru(fru)) 02326 return ENOSYS; 02327 02328 if (area >= IPMI_FRU_FTR_NUMBER) 02329 return EINVAL; 02330 _ipmi_fru_lock(fru); 02331 recs = normal_fru_get_recs(fru); 02332 if (!recs[area]) { 02333 _ipmi_fru_unlock(fru); 02334 return ENOENT; 02335 } 02336 02337 *offset = recs[area]->offset; 02338 02339 _ipmi_fru_unlock(fru); 02340 return 0; 02341 }
|
|
||||||||||||||||
|
Definition at line 2463 of file normal_fru.c. References _ipmi_fru_is_normal_fru(), _ipmi_fru_lock(), _ipmi_fru_unlock(), IPMI_FRU_FTR_NUMBER, normal_fru_get_recs(), and ipmi_fru_record_s::used_length. Referenced by fru_areainfo(). 02466 { 02467 ipmi_fru_record_t **recs; 02468 02469 if (!_ipmi_fru_is_normal_fru(fru)) 02470 return ENOSYS; 02471 02472 if (area >= IPMI_FRU_FTR_NUMBER) 02473 return EINVAL; 02474 02475 _ipmi_fru_lock(fru); 02476 recs = normal_fru_get_recs(fru); 02477 if (!recs[area]) { 02478 _ipmi_fru_unlock(fru); 02479 return ENOENT; 02480 } 02481 02482 *used_length = recs[area]->used_length; 02483 02484 _ipmi_fru_unlock(fru); 02485 return 0; 02486 }
|
|
||||||||||||||||
|
Definition at line 2419 of file normal_fru.c. References _ipmi_fru_is_normal_fru(), _ipmi_fru_lock(), _ipmi_fru_unlock(), ipmi_fru_record_s::changed, check_rec_position(), IPMI_FRU_FTR_NUMBER, ipmi_fru_record_s::length, normal_fru_get_recs(), and ipmi_fru_record_s::rewrite. Referenced by fru_area_length(). 02422 { 02423 ipmi_fru_record_t **recs; 02424 int rv; 02425 02426 if (!_ipmi_fru_is_normal_fru(fru)) 02427 return ENOSYS; 02428 02429 /* Truncate the length to a multiple of 8. */ 02430 length = length & ~(8-1); 02431 02432 if (area >= IPMI_FRU_FTR_NUMBER) 02433 return EINVAL; 02434 if (length == 0) 02435 return EINVAL; 02436 _ipmi_fru_lock(fru); 02437 recs = normal_fru_get_recs(fru); 02438 if (!recs[area]) { 02439 _ipmi_fru_unlock(fru); 02440 return ENOENT; 02441 } 02442 02443 if (recs[area]->length == length) { 02444 _ipmi_fru_unlock(fru); 02445 return 0; 02446 } 02447 02448 rv = check_rec_position(fru, area, recs[area]->offset, length); 02449 if (!rv) { 02450 if (length > recs[area]->length) 02451 /* Only need to rewrite the whole record (to get the zeroes 02452 into the unused area) if we increase the length. */ 02453 recs[area]->rewrite = 1; 02454 recs[area]->length = length; 02455 recs[area]->changed = 1; 02456 } 02457 02458 _ipmi_fru_unlock(fru); 02459 return rv; 02460 }
|
|
||||||||||||||||
|
Definition at line 2370 of file normal_fru.c. References _ipmi_fru_get_rec_data(), _ipmi_fru_is_normal_fru(), _ipmi_fru_lock(), _ipmi_fru_unlock(), ipmi_fru_record_s::changed, check_rec_position(), normal_fru_rec_data_s::header_changed, IPMI_FRU_FTR_MULTI_RECORD_AREA, IPMI_FRU_FTR_NUMBER, ipmi_fru_record_s::length, normal_fru_get_recs(), ipmi_fru_record_s::offset, and ipmi_fru_record_s::rewrite. Referenced by fru_area_offset(). 02373 { 02374 normal_fru_rec_data_t *info = _ipmi_fru_get_rec_data(fru); 02375 ipmi_fru_record_t **recs; 02376 int rv; 02377 02378 if (!_ipmi_fru_is_normal_fru(fru)) 02379 return ENOSYS; 02380 02381 if (area >= IPMI_FRU_FTR_NUMBER) 02382 return EINVAL; 02383 02384 _ipmi_fru_lock(fru); 02385 recs = normal_fru_get_recs(fru); 02386 if (!recs[area]) { 02387 _ipmi_fru_unlock(fru); 02388 return ENOENT; 02389 } 02390 02391 if (recs[area]->offset == offset) { 02392 _ipmi_fru_unlock(fru); 02393 return 0; 02394 } 02395 02396 if (area == IPMI_FRU_FTR_MULTI_RECORD_AREA) { 02397 /* Multi-record lengths are not defined, but just goto the end. 02398 So adjust the length for comparison here. */ 02399 int newlength = (recs[area]->length 02400 + recs[area]->offset - offset); 02401 rv = check_rec_position(fru, area, offset, newlength); 02402 } else { 02403 rv = check_rec_position(fru, area, offset, recs[area]->length); 02404 } 02405 if (!rv) { 02406 if (area == IPMI_FRU_FTR_MULTI_RECORD_AREA) 02407 recs[area]->length += recs[area]->offset - offset; 02408 recs[area]->offset = offset; 02409 recs[area]->changed = 1; 02410 recs[area]->rewrite = 1; 02411 info->header_changed = 1; 02412 } 02413 02414 _ipmi_fru_unlock(fru); 02415 return rv; 02416 }
|
|
|
Definition at line 1287 of file fru.c. References ipmi_mem_free(). Referenced by traverse_fru_node_tree(). 01288 { 01289 ipmi_mem_free(data); 01290 }
|
|
||||||||||||
|
Definition at line 2300 of file normal_fru.c. References _ipmi_fru_is_normal_fru(), _ipmi_fru_lock(), _ipmi_fru_unlock(), fru_record_destroy(), IPMI_FRU_FTR_NUMBER, and normal_fru_get_recs(). Referenced by fru_area_delete(). 02301 { 02302 ipmi_fru_record_t **recs; 02303 02304 if (!_ipmi_fru_is_normal_fru(fru)) 02305 return ENOSYS; 02306 02307 if (area >= IPMI_FRU_FTR_NUMBER) 02308 return EINVAL; 02309 02310 _ipmi_fru_lock(fru); 02311 recs = normal_fru_get_recs(fru); 02312 fru_record_destroy(recs[area]); 02313 recs[area] = NULL; 02314 _ipmi_fru_unlock(fru); 02315 return 0; 02316 }
|
|
|
Definition at line 219 of file fru.c. References fru_put(). Referenced by atca_addr_tab_root_destroy(), atca_p2p_root_destroy(), fru_array_idx_destroy(), fru_mr_array_idx_destroy(), and fru_node_destroy(). 00220 { 00221 fru_put(fru); 00222 }
|
|
||||||||||||||||
|
Definition at line 380 of file fru.c. References _ipmi_fru_lock(), _ipmi_fru_unlock(), ipmi_fru_s::domain_id, fru_put(), frul, ipmi_fru_s::in_frulist, ipmi_domain_attr_get_data(), ipmi_domain_attr_put(), ipmi_domain_id_find_attribute(), IPMI_FRU_ATTR_NAME, ipmi_fru_destroy_internal(), and locked_list_remove(). Referenced by fru_close(), fru_fetched(), ipmi_domain_fru_alloc(), and ipmi_fru_alloc(). 00383 { 00384 ipmi_domain_attr_t *attr; 00385 locked_list_t *frul; 00386 int rv; 00387 00388 _ipmi_fru_lock(fru); 00389 if (fru->in_frulist) { 00390 rv = ipmi_domain_id_find_attribute(fru->domain_id, IPMI_FRU_ATTR_NAME, 00391 &attr); 00392 if (rv) { 00393 _ipmi_fru_unlock(fru); 00394 return rv; 00395 } 00396 fru->in_frulist = 0; 00397 _ipmi_fru_unlock(fru); 00398 00399 frul = ipmi_domain_attr_get_data(attr); 00400 if (! locked_list_remove(frul, fru, NULL)) { 00401 /* Not in the list, it's already been removed. */ 00402 ipmi_domain_attr_put(attr); 00403 _ipmi_fru_unlock(fru); 00404 return EINVAL; 00405 } 00406 ipmi_domain_attr_put(attr); 00407 fru_put(fru); /* It's not in the list any more. */ 00408 } else { 00409 /* User can't destroy FRUs he didn't allocate. */ 00410 _ipmi_fru_unlock(fru); 00411 return EPERM; 00412 } 00413 00414 return ipmi_fru_destroy_internal(fru, handler, cb_data); 00415 }
|
|