Main Page | Class List | Directories | File List | Class Members | File Members

ipmi_fru.h File Reference

#include <OpenIPMI/ipmi_types.h>
#include <OpenIPMI/ipmi_bits.h>
#include <time.h>

Go to the source code of this file.

Defines

#define IPMI_FRU_NAME_LEN   64
#define IPMI_FRU_FTR_INTERNAL_USE_AREA   0
#define IPMI_FRU_FTR_CHASSIS_INFO_AREA   1
#define IPMI_FRU_FTR_BOARD_INFO_AREA   2
#define IPMI_FRU_FTR_PRODUCT_INFO_AREA   3
#define IPMI_FRU_FTR_MULTI_RECORD_AREA   4
#define IPMI_FRU_FTR_NUMBER   (IPMI_FRU_FTR_MULTI_RECORD_AREA + 1)

Typedefs

typedef ipmi_fru_node_s ipmi_fru_node_t
typedef void(* ipmi_fru_fetched_cb )(ipmi_fru_t *fru, int err, void *cb_data)
typedef void(* ipmi_fru_cb )(ipmi_domain_t *domain, ipmi_fru_t *fru, int err, void *cb_data)
typedef void(* ipmi_fru_destroyed_cb )(ipmi_fru_t *fru, void *cb_data)
typedef void(* ipmi_fru_ptr_cb )(ipmi_fru_t *fru, void *cb_data)

Enumerations

enum  ipmi_fru_data_type_e {
  IPMI_FRU_DATA_INT, IPMI_FRU_DATA_TIME, IPMI_FRU_DATA_ASCII, IPMI_FRU_DATA_BINARY,
  IPMI_FRU_DATA_UNICODE, IPMI_FRU_DATA_BOOLEAN, IPMI_FRU_DATA_FLOAT, IPMI_FRU_DATA_SUB_NODE
}

Functions

ipmi_domain_id_t ipmi_fru_get_domain_id (ipmi_fru_t *fru)
int ipmi_fru_get_name (ipmi_fru_t *fru, char *name, int length)
int ipmi_fru_alloc (ipmi_domain_t *domain, unsigned char is_logical, unsigned char device_address, unsigned char device_id, unsigned char lun, unsigned char private_bus, unsigned char channel, ipmi_fru_fetched_cb fetched_handler, void *fetched_cb_data, ipmi_fru_t **new_fru)
int ipmi_domain_fru_alloc (ipmi_domain_t *domain, unsigned char is_logical, unsigned char device_address, unsigned char device_id, unsigned char lun, unsigned char private_bus, unsigned char channel, ipmi_fru_cb fetched_handler, void *fetched_cb_data, ipmi_fru_t **new_fru)
int ipmi_fru_destroy (ipmi_fru_t *fru, ipmi_fru_destroyed_cb handler, void *cb_data)
void ipmi_fru_iterate_frus (ipmi_domain_t *domain, ipmi_fru_ptr_cb handler, void *cb_data)
unsigned int ipmi_fru_get_data_length (ipmi_fru_t *fru)
void ipmi_fru_ref (ipmi_fru_t *fru)
void ipmi_fru_deref (ipmi_fru_t *fru)
int ipmi_fru_get_root_node (ipmi_fru_t *fru, const char **type, ipmi_fru_node_t **node)
void ipmi_fru_get_node (ipmi_fru_node_t *node)
void ipmi_fru_put_node (ipmi_fru_node_t *node)
int ipmi_fru_node_get_field (ipmi_fru_node_t *node, unsigned int index, const char **name, enum ipmi_fru_data_type_e *dtype, int *intval, time_t *time, double *floatval, char **data, unsigned int *data_len, ipmi_fru_node_t **sub_node)
void ipmi_fru_data_free (char *data)
int ipmi_fru_get_internal_use_version (ipmi_fru_t *fru, unsigned char *version)
int ipmi_fru_get_internal_use_len (ipmi_fru_t *fru, unsigned int *length)
int ipmi_fru_get_internal_use (ipmi_fru_t *fru, unsigned char *data, unsigned int *max_len)
int ipmi_fru_get_chassis_info_version (ipmi_fru_t *fru, unsigned char *version)
int ipmi_fru_get_chassis_info_type (ipmi_fru_t *fru, unsigned char *type)
int ipmi_fru_get_chassis_info_part_number_len (ipmi_fru_t *fru, unsigned int *length)
int ipmi_fru_get_chassis_info_part_number_type (ipmi_fru_t *fru, enum ipmi_str_type_e *type)
int ipmi_fru_get_chassis_info_part_number (ipmi_fru_t *fru, char *str, unsigned int *strlen)
int ipmi_fru_get_chassis_info_serial_number_len (ipmi_fru_t *fru, unsigned int *length)
int ipmi_fru_get_chassis_info_serial_number_type (ipmi_fru_t *fru, enum ipmi_str_type_e *type)
int ipmi_fru_get_chassis_info_serial_number (ipmi_fru_t *fru, char *str, unsigned int *strlen)
int ipmi_fru_get_chassis_info_custom_len (ipmi_fru_t *fru, unsigned int num, unsigned int *length)
int ipmi_fru_get_chassis_info_custom_type (ipmi_fru_t *fru, unsigned int num, enum ipmi_str_type_e *type)
int ipmi_fru_get_chassis_info_custom (ipmi_fru_t *fru, unsigned int num, char *str, unsigned int *strlen)
int ipmi_fru_get_board_info_version (ipmi_fru_t *fru, unsigned char *version)
int ipmi_fru_get_board_info_lang_code (ipmi_fru_t *fru, unsigned char *type)
int ipmi_fru_get_board_info_mfg_time (ipmi_fru_t *fru, time_t *time)
int ipmi_fru_get_board_info_board_manufacturer_len (ipmi_fru_t *fru, unsigned int *length)
int ipmi_fru_get_board_info_board_manufacturer_type (ipmi_fru_t *fru, enum ipmi_str_type_e *type)
int ipmi_fru_get_board_info_board_manufacturer (ipmi_fru_t *fru, char *str, unsigned int *strlen)
int ipmi_fru_get_board_info_board_product_name_len (ipmi_fru_t *fru, unsigned int *length)
int ipmi_fru_get_board_info_board_product_name_type (ipmi_fru_t *fru, enum ipmi_str_type_e *type)
int ipmi_fru_get_board_info_board_product_name (ipmi_fru_t *fru, char *str, unsigned int *strlen)
int ipmi_fru_get_board_info_board_serial_number_len (ipmi_fru_t *fru, unsigned int *length)
int ipmi_fru_get_board_info_board_serial_number_type (ipmi_fru_t *fru, enum ipmi_str_type_e *type)
int ipmi_fru_get_board_info_board_serial_number (ipmi_fru_t *fru, char *str, unsigned int *strlen)
int ipmi_fru_get_board_info_board_part_number_len (ipmi_fru_t *fru, unsigned int *length)
int ipmi_fru_get_board_info_board_part_number_type (ipmi_fru_t *fru, enum ipmi_str_type_e *type)
int ipmi_fru_get_board_info_board_part_number (ipmi_fru_t *fru, char *str, unsigned int *strlen)
int ipmi_fru_get_board_info_fru_file_id_len (ipmi_fru_t *fru, unsigned int *length)
int ipmi_fru_get_board_info_fru_file_id_type (ipmi_fru_t *fru, enum ipmi_str_type_e *type)
int ipmi_fru_get_board_info_fru_file_id (ipmi_fru_t *fru, char *str, unsigned int *strlen)
int ipmi_fru_get_board_info_custom_len (ipmi_fru_t *fru, unsigned int num, unsigned int *length)
int ipmi_fru_get_board_info_custom_type (ipmi_fru_t *fru, unsigned int num, enum ipmi_str_type_e *type)
int ipmi_fru_get_board_info_custom (ipmi_fru_t *fru, unsigned int num, char *str, unsigned int *strlen)
int ipmi_fru_get_product_info_version (ipmi_fru_t *fru, unsigned char *version)
int ipmi_fru_get_product_info_lang_code (ipmi_fru_t *fru, unsigned char *type)
int ipmi_fru_get_product_info_manufacturer_name_len (ipmi_fru_t *fru, unsigned int *length)
int ipmi_fru_get_product_info_manufacturer_name_type (ipmi_fru_t *fru, enum ipmi_str_type_e *type)
int ipmi_fru_get_product_info_manufacturer_name (ipmi_fru_t *fru, char *str, unsigned int *strlen)
int ipmi_fru_get_product_info_product_name_len (ipmi_fru_t *fru, unsigned int *length)
int ipmi_fru_get_product_info_product_name_type (ipmi_fru_t *fru, enum ipmi_str_type_e *type)
int ipmi_fru_get_product_info_product_name (ipmi_fru_t *fru, char *str, unsigned int *strlen)
int ipmi_fru_get_product_info_product_part_model_number_len (ipmi_fru_t *fru, unsigned int *length)
int ipmi_fru_get_product_info_product_part_model_number_type (ipmi_fru_t *fru, enum ipmi_str_type_e *type)
int ipmi_fru_get_product_info_product_part_model_number (ipmi_fru_t *fru, char *str, unsigned int *strlen)
int ipmi_fru_get_product_info_product_version_len (ipmi_fru_t *fru, unsigned int *length)
int ipmi_fru_get_product_info_product_version_type (ipmi_fru_t *fru, enum ipmi_str_type_e *type)
int ipmi_fru_get_product_info_product_version (ipmi_fru_t *fru, char *str, unsigned int *strlen)
int ipmi_fru_get_product_info_product_serial_number_len (ipmi_fru_t *fru, unsigned int *length)
int ipmi_fru_get_product_info_product_serial_number_type (ipmi_fru_t *fru, enum ipmi_str_type_e *type)
int ipmi_fru_get_product_info_product_serial_number (ipmi_fru_t *fru, char *str, unsigned int *strlen)
int ipmi_fru_get_product_info_asset_tag_len (ipmi_fru_t *fru, unsigned int *length)
int ipmi_fru_get_product_info_asset_tag_type (ipmi_fru_t *fru, enum ipmi_str_type_e *type)
int ipmi_fru_get_product_info_asset_tag (ipmi_fru_t *fru, char *str, unsigned int *strlen)
int ipmi_fru_get_product_info_fru_file_id_len (ipmi_fru_t *fru, unsigned int *length)
int ipmi_fru_get_product_info_fru_file_id_type (ipmi_fru_t *fru, enum ipmi_str_type_e *type)
int ipmi_fru_get_product_info_fru_file_id (ipmi_fru_t *fru, char *str, unsigned int *strlen)
int ipmi_fru_get_product_info_custom_len (ipmi_fru_t *fru, unsigned int num, unsigned int *length)
int ipmi_fru_get_product_info_custom_type (ipmi_fru_t *fru, unsigned int num, enum ipmi_str_type_e *type)
int ipmi_fru_get_product_info_custom (ipmi_fru_t *fru, unsigned int num, char *str, unsigned int *strlen)
unsigned int ipmi_fru_get_num_multi_records (ipmi_fru_t *fru)
int ipmi_fru_get_multi_record_type (ipmi_fru_t *fru, unsigned int num, unsigned char *type)
int ipmi_fru_get_multi_record_format_version (ipmi_fru_t *fru, unsigned int num, unsigned char *ver)
int ipmi_fru_get_multi_record_data_len (ipmi_fru_t *fru, unsigned int num, unsigned int *len)
int ipmi_fru_get_multi_record_data (ipmi_fru_t *fru, unsigned int num, unsigned char *data, unsigned int *length)
int ipmi_fru_get (ipmi_fru_t *fru, int index, const char **name, int *num, enum ipmi_fru_data_type_e *dtype, int *intval, time_t *time, char **data, unsigned int *data_len)
char * ipmi_fru_index_to_str (int idx)
int ipmi_fru_str_to_index (char *name)
int ipmi_fru_add_area (ipmi_fru_t *fru, unsigned int area, unsigned int offset, unsigned int length)
int ipmi_fru_delete_area (ipmi_fru_t *fru, int area)
int ipmi_fru_area_get_offset (ipmi_fru_t *fru, unsigned int area, unsigned int *offset)
int ipmi_fru_area_get_length (ipmi_fru_t *fru, unsigned int area, unsigned int *length)
int ipmi_fru_area_set_offset (ipmi_fru_t *fru, unsigned int area, unsigned int offset)
int ipmi_fru_area_set_length (ipmi_fru_t *fru, unsigned int area, unsigned int length)
int ipmi_fru_area_get_used_length (ipmi_fru_t *fru, unsigned int area, unsigned int *used_length)
int ipmi_fru_set_internal_use (ipmi_fru_t *fru, unsigned char *data, unsigned int len)
int ipmi_fru_set_chassis_info_type (ipmi_fru_t *fru, unsigned char type)
int ipmi_fru_set_chassis_info_part_number (ipmi_fru_t *fru, enum ipmi_str_type_e type, char *str, unsigned int len)
int ipmi_fru_set_chassis_info_serial_number (ipmi_fru_t *fru, enum ipmi_str_type_e type, char *str, unsigned int len)
int ipmi_fru_set_chassis_info_custom (ipmi_fru_t *fru, unsigned int num, enum ipmi_str_type_e type, char *str, unsigned int len)
int ipmi_fru_set_board_info_lang_code (ipmi_fru_t *fru, unsigned char type)
int ipmi_fru_set_board_info_mfg_time (ipmi_fru_t *fru, time_t time)
int ipmi_fru_set_board_info_board_manufacturer (ipmi_fru_t *fru, enum ipmi_str_type_e type, char *str, unsigned int len)
int ipmi_fru_set_board_info_board_product_name (ipmi_fru_t *fru, enum ipmi_str_type_e type, char *str, unsigned int len)
int ipmi_fru_set_board_info_board_serial_number (ipmi_fru_t *fru, enum ipmi_str_type_e type, char *str, unsigned int len)
int ipmi_fru_set_board_info_board_part_number (ipmi_fru_t *fru, enum ipmi_str_type_e type, char *str, unsigned int len)
int ipmi_fru_set_board_info_fru_file_id (ipmi_fru_t *fru, enum ipmi_str_type_e type, char *str, unsigned int len)
int ipmi_fru_set_board_info_custom (ipmi_fru_t *fru, unsigned int num, enum ipmi_str_type_e type, char *str, unsigned int len)
int ipmi_fru_set_product_info_lang_code (ipmi_fru_t *fru, unsigned char type)
int ipmi_fru_set_product_info_manufacturer_name (ipmi_fru_t *fru, enum ipmi_str_type_e type, char *str, unsigned int len)
int ipmi_fru_set_product_info_product_name (ipmi_fru_t *fru, enum ipmi_str_type_e type, char *str, unsigned int len)
int ipmi_fru_set_product_info_product_part_model_number (ipmi_fru_t *fru, enum ipmi_str_type_e type, char *str, unsigned int len)
int ipmi_fru_set_product_info_product_version (ipmi_fru_t *fru, enum ipmi_str_type_e type, char *str, unsigned int len)
int ipmi_fru_set_product_info_product_serial_number (ipmi_fru_t *fru, enum ipmi_str_type_e type, char *str, unsigned int len)
int ipmi_fru_set_product_info_asset_tag (ipmi_fru_t *fru, enum ipmi_str_type_e type, char *str, unsigned int len)
int ipmi_fru_set_product_info_fru_file_id (ipmi_fru_t *fru, enum ipmi_str_type_e type, char *str, unsigned int len)
int ipmi_fru_set_product_info_custom (ipmi_fru_t *fru, unsigned int num, enum ipmi_str_type_e type, char *str, unsigned int len)
int ipmi_fru_set_multi_record (ipmi_fru_t *fru, unsigned int num, unsigned char type, unsigned char version, unsigned char *data, unsigned int length)
int ipmi_fru_set_int_val (ipmi_fru_t *fru, int index, int num, int val)
int ipmi_fru_set_time_val (ipmi_fru_t *fru, int index, int num, time_t time)
int ipmi_fru_set_float_val (ipmi_fru_t *fru, int index, int num, double val)
int ipmi_fru_set_data_val (ipmi_fru_t *fru, int index, int num, enum ipmi_fru_data_type_e dtype, char *data, unsigned int len)
int ipmi_fru_write (ipmi_fru_t *fru, ipmi_fru_cb done, void *cb_data)
int ipmi_fru_multi_record_get_root_node (ipmi_fru_t *fru, unsigned int record_num, const char **name, ipmi_fru_node_t **node)
int ipmi_fru_get_internal_use_data (ipmi_fru_t *fru, unsigned char *data, unsigned int *max_len)
int ipmi_fru_get_internal_use_length (ipmi_fru_t *fru, unsigned int *length)


Define Documentation

#define IPMI_FRU_FTR_BOARD_INFO_AREA   2
 

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().

#define IPMI_FRU_FTR_CHASSIS_INFO_AREA   1
 

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().

#define IPMI_FRU_FTR_INTERNAL_USE_AREA   0
 

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().

#define IPMI_FRU_FTR_MULTI_RECORD_AREA   4
 

Definition at line 502 of file ipmi_fru.h.

Referenced by fru_decode_multi_record_area(), fru_encode_multi_record_area(), fru_node_get_field(), fru_write(), get_fru_by_name(), ipmi_fru_area_set_offset(), ipmi_fru_get_multi_record_data(), ipmi_fru_get_multi_record_data_len(), ipmi_fru_get_multi_record_format_version(), ipmi_fru_get_multi_record_type(), ipmi_fru_get_num_multi_records(), ipmi_fru_multi_record_get_root_node(), and ipmi_fru_set_multi_record().

#define IPMI_FRU_FTR_NUMBER   (IPMI_FRU_FTR_MULTI_RECORD_AREA + 1)
 

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().

#define IPMI_FRU_FTR_PRODUCT_INFO_AREA   3
 

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().

#define IPMI_FRU_NAME_LEN   64
 

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().


Typedef Documentation

typedef void(* ipmi_fru_cb)(ipmi_domain_t *domain, ipmi_fru_t *fru, int err, void *cb_data)
 

Definition at line 88 of file ipmi_fru.h.

typedef void(* ipmi_fru_destroyed_cb)(ipmi_fru_t *fru, void *cb_data)
 

Definition at line 107 of file ipmi_fru.h.

typedef void(* ipmi_fru_fetched_cb)(ipmi_fru_t *fru, int err, void *cb_data)
 

Definition at line 72 of file ipmi_fru.h.

typedef struct ipmi_fru_node_s ipmi_fru_node_t
 

Definition at line 59 of file ipmi_fru.h.

typedef void(* ipmi_fru_ptr_cb)(ipmi_fru_t *fru, void *cb_data)
 

Definition at line 116 of file ipmi_fru.h.


Enumeration Type Documentation

enum ipmi_fru_data_type_e
 

Enumerator:
IPMI_FRU_DATA_INT 
IPMI_FRU_DATA_TIME 
IPMI_FRU_DATA_ASCII 
IPMI_FRU_DATA_BINARY 
IPMI_FRU_DATA_UNICODE 
IPMI_FRU_DATA_BOOLEAN 
IPMI_FRU_DATA_FLOAT 
IPMI_FRU_DATA_SUB_NODE 

Definition at line 47 of file ipmi_fru.h.


Function Documentation

int ipmi_domain_fru_alloc ipmi_domain_t domain,
unsigned char  is_logical,
unsigned char  device_address,
unsigned char  device_id,
unsigned char  lun,
unsigned char  private_bus,
unsigned char  channel,
ipmi_fru_cb  fetched_handler,
void *  fetched_cb_data,
ipmi_fru_t **  new_fru
 

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 }

int ipmi_fru_add_area ipmi_fru_t fru,
unsigned int  area,
unsigned int  offset,
unsigned int  length
 

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 }

int ipmi_fru_alloc ipmi_domain_t domain,
unsigned char  is_logical,
unsigned char  device_address,
unsigned char  device_id,
unsigned char  lun,
unsigned char  private_bus,
unsigned char  channel,
ipmi_fru_fetched_cb  fetched_handler,
void *  fetched_cb_data,
ipmi_fru_t **  new_fru
 

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 }

int ipmi_fru_area_get_length ipmi_fru_t fru,
unsigned int  area,
unsigned int *  length
 

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 }

int ipmi_fru_area_get_offset ipmi_fru_t fru,
unsigned int  area,
unsigned int *  offset
 

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 }

int ipmi_fru_area_get_used_length ipmi_fru_t fru,
unsigned int  area,
unsigned int *  used_length
 

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 }

int ipmi_fru_area_set_length ipmi_fru_t fru,
unsigned int  area,
unsigned int  length
 

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 }

int ipmi_fru_area_set_offset ipmi_fru_t fru,
unsigned int  area,
unsigned int  offset
 

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 }

void ipmi_fru_data_free char *  data  ) 
 

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 }

int ipmi_fru_delete_area ipmi_fru_t fru,
int  area
 

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 }

void ipmi_fru_deref ipmi_fru_t fru  ) 
 

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 }

int ipmi_fru_destroy ipmi_fru_t fru,
ipmi_fru_destroyed_cb  handler,
void *  cb_data
 

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 }

int ipmi_fru_get ipmi_fru_t fru,
int  index,
const char **  name,
int *