lib/ipmi_kontronoem.c - clean up formatting, code

Commit cleans up formatting in 'lib/ipmi_kontronoem.c'. Also, it adds some error
messages and fixes return codes.
This commit is contained in:
Zdenek Styblik 2014-09-21 09:36:14 +02:00
parent 5c85c7bc61
commit 58837647c2

View File

@ -39,175 +39,129 @@
* *
* This code implements an Kontron OEM proprietary commands. * This code implements an Kontron OEM proprietary commands.
*/ */
#include <string.h> #include <string.h>
#include <ipmitool/helper.h> #include <ipmitool/helper.h>
#include <ipmitool/log.h>
#include <ipmitool/ipmi.h> #include <ipmitool/ipmi.h>
#include <ipmitool/ipmi_intf.h> #include <ipmitool/ipmi_intf.h>
#include <ipmitool/ipmi_fru.h> #include <ipmitool/ipmi_fru.h>
extern int verbose; extern int verbose;
extern int read_fru_area(struct ipmi_intf * intf, struct fru_info *fru, extern int read_fru_area(struct ipmi_intf *intf, struct fru_info *fru,
uint8_t id, uint32_t offset, uint32_t length, uint8_t id, uint32_t offset, uint32_t length,
uint8_t *frubuf); uint8_t *frubuf);
extern int write_fru_area(struct ipmi_intf * intf, struct fru_info *fru, extern int write_fru_area(struct ipmi_intf * intf, struct fru_info *fru,
uint8_t id, uint16_t soffset, uint8_t id, uint16_t soffset,
uint16_t doffset, uint16_t length, uint16_t doffset, uint16_t length,
uint8_t *pFrubuf); uint8_t *pFrubuf);
extern char *get_fru_area_str(uint8_t *data, uint32_t *offset);
extern char * get_fru_area_str(uint8_t * data, uint32_t * offset);
static void ipmi_kontron_help(void); static void ipmi_kontron_help(void);
static int ipmi_kontron_set_serial_number(struct ipmi_intf * intf); static int ipmi_kontron_set_serial_number(struct ipmi_intf *intf);
static int ipmi_kontron_set_mfg_date (struct ipmi_intf * intf); static int ipmi_kontron_set_mfg_date (struct ipmi_intf *intf);
static void ipmi_kontron_nextboot_help(void); static void ipmi_kontron_nextboot_help(void);
static int ipmi_kontron_nextboot_set(struct ipmi_intf * intf, static int ipmi_kontron_nextboot_set(struct ipmi_intf *intf, int argc,
int argc, char **argv); char **argv);
static int ipmi_kontronoem_send_set_large_buffer(struct ipmi_intf *intf,
unsigned char channel, unsigned char size);
static int ipmi_kontronoem_send_set_large_buffer(struct ipmi_intf * intf, static char *bootdev[] = {"BIOS", "FDD", "HDD", "CDROM", "network", 0};
unsigned char channel,
unsigned char size);
int int
ipmi_kontronoem_main(struct ipmi_intf * intf, int argc, char ** argv) ipmi_kontronoem_main(struct ipmi_intf *intf, int argc, char **argv)
{ {
int rc = 0; int rc = 0;
if (argc == 0) {
if (argc == 0) lprintf(LOG_ERR, "Not enough parameters given.");
ipmi_kontron_help(); ipmi_kontron_help();
else if (strncmp(argv[0], "help", 4) == 0) return (-1);
}
if (strncmp(argv[0], "help", 4) == 0) {
ipmi_kontron_help(); ipmi_kontron_help();
rc = 0;
else if (!strncmp(argv[0], "setsn", 5)) } else if (!strncmp(argv[0], "setsn", 5)) {
{ if (argc < 1) {
if(argc >= 1)
{
if(ipmi_kontron_set_serial_number(intf) > 0)
{
printf("FRU serial number setted successfully\n");
}
else
{
printf("FRU serial number set failed\n");
}
}
else
{
printf("fru setsn\n"); printf("fru setsn\n");
return (-1);
} }
if (ipmi_kontron_set_serial_number(intf) > 0) {
printf("FRU serial number setted successfully\n");
} else {
printf("FRU serial number set failed\n");
rc = (-1);
} }
else if (!strncmp(argv[0], "setmfgdate", 5)) } else if (!strncmp(argv[0], "setmfgdate", 10)) {
{ if (argc < 1) {
if(argc >= 1)
{
if(ipmi_kontron_set_mfg_date(intf) > 0)
{
printf("FRU manufacturing date setted successfully\n");
}
else
{
printf("FRU manufacturing date set failed\n");
}
}
else
{
printf("fru setmfgdate\n"); printf("fru setmfgdate\n");
return (-1);
} }
if (ipmi_kontron_set_mfg_date(intf) > 0) {
printf("FRU manufacturing date setted successfully\n");
} else {
printf("FRU manufacturing date set failed\n");
rc = (-1);
} }
else if (!strncmp(argv[0], "nextboot", sizeof("nextboot")-1)) } else if (!strncmp(argv[0], "nextboot", 8)) {
{ if (argc < 2) {
if (argc > 1) lprintf(LOG_ERR, "Not enough parameters given.");
{
if ((rc = ipmi_kontron_nextboot_set(intf, argc-1, argv+1)) == 0)
{
printf("Nextboot set successfully\n");
}
else
{
printf("Nextboot set failed\n");
}
}
else
{
ipmi_kontron_nextboot_help(); ipmi_kontron_nextboot_help();
rc = (-1);
} }
rc = ipmi_kontron_nextboot_set(intf, (argc - 1), (argv + 1));
if (rc == 0) {
printf("Nextboot set successfully\n");
} else {
printf("Nextboot set failed\n");
rc = (-1);
} }
} else {
else lprintf(LOG_ERR, "Invalid Kontron command: %s", argv[0]);
{
printf("Invalid Kontron command: %s", argv[0]);
ipmi_kontron_help(); ipmi_kontron_help();
rc = -1; rc = (-1);
} }
return rc; return rc;
} }
static void
static void ipmi_kontron_help(void) ipmi_kontron_help(void)
{ {
printf("Kontron Commands: setsn setmfgdate nextboot\n"); printf("Kontron Commands: setsn setmfgdate nextboot\n");
} }
int
int ipmi_kontronoem_set_large_buffer(struct ipmi_intf * intf, unsigned char size) ipmi_kontronoem_set_large_buffer(struct ipmi_intf *intf, unsigned char size)
{ {
uint8_t error_occurs = 0; uint8_t error_occurs = 0;
uint32_t prev_target_addr = intf->target_addr ; uint32_t prev_target_addr = intf->target_addr ;
if (intf->target_addr > 0 && (intf->target_addr != intf->my_addr)) {
if ( intf->target_addr > 0 && (intf->target_addr != intf->my_addr) )
{
intf->target_addr = intf->my_addr; intf->target_addr = intf->my_addr;
printf("Set local big buffer\n"); printf("Set local big buffer\n");
if(ipmi_kontronoem_send_set_large_buffer( intf, 0x0e, size ) == 0) if (ipmi_kontronoem_send_set_large_buffer(intf, 0x0e, size) == 0) {
{
printf("Set local big buffer:success\n"); printf("Set local big buffer:success\n");
} } else {
else
{
error_occurs = 1; error_occurs = 1;
} }
if (error_occurs == 0) {
if (error_occurs == 0) if (ipmi_kontronoem_send_set_large_buffer(intf, 0x00, size) == 0) {
{
if(ipmi_kontronoem_send_set_large_buffer( intf, 0x00, size ) == 0)
{
printf("IPMB was set\n"); printf("IPMB was set\n");
} } else {
else
{
/* Revert back the previous set large buffer */ /* Revert back the previous set large buffer */
error_occurs = 1; error_occurs = 1;
ipmi_kontronoem_send_set_large_buffer( intf, 0x0e, 0 ); ipmi_kontronoem_send_set_large_buffer( intf, 0x0e, 0 );
} }
} }
/* Restore target address */ /* Restore target address */
intf->target_addr = prev_target_addr; intf->target_addr = prev_target_addr;
} }
if (error_occurs == 0) {
if (error_occurs == 0) if(ipmi_kontronoem_send_set_large_buffer(intf, 0x0e, size) == 0) {
{ /* printf("Set remote big buffer\n"); */
if(ipmi_kontronoem_send_set_large_buffer( intf, 0x0e, size ) == 0) } else {
{ if (intf->target_addr > 0 && (intf->target_addr != intf->my_addr)) {
//printf("Set remote big buffer\n"); /* Error occurs revert back the previous set large buffer */
}
else
{
if ( intf->target_addr > 0 && (intf->target_addr != intf->my_addr) )
{
/* Error occurs revert back the previous set large buffer*/
intf->target_addr = intf->my_addr; intf->target_addr = intf->my_addr;
/* ipmi_kontronoem_send_set_large_buffer(intf, 0x00, 0); */
//ipmi_kontronoem_send_set_large_buffer( intf, 0x00, 0 ); ipmi_kontronoem_send_set_large_buffer(intf, 0x0e, 0);
ipmi_kontronoem_send_set_large_buffer( intf, 0x0e, 0 );
intf->target_addr = prev_target_addr; intf->target_addr = prev_target_addr;
} }
} }
@ -215,34 +169,30 @@ int ipmi_kontronoem_set_large_buffer(struct ipmi_intf * intf, unsigned char size
return error_occurs; return error_occurs;
} }
int
int ipmi_kontronoem_send_set_large_buffer(struct ipmi_intf * intf, unsigned char channel,unsigned char size) ipmi_kontronoem_send_set_large_buffer(struct ipmi_intf *intf,
unsigned char channel, unsigned char size)
{ {
struct ipmi_rs *rsp; struct ipmi_rs *rsp;
struct ipmi_rq req; struct ipmi_rq req;
uint8_t msg_data[2]; uint8_t msg_data[2];
int i; int i;
memset(msg_data, 0, sizeof(msg_data)); memset(msg_data, 0, sizeof(msg_data));
msg_data[0] = channel/*0x0e*/; // Currently running interface /* channel =~ 0x0e => Currently running interface */
msg_data[0] = channel;
msg_data[1] = size; msg_data[1] = size;
memset(&req, 0, sizeof(req)); memset(&req, 0, sizeof(req));
req.msg.netfn = 0x3E; /* OEM NetFn */ req.msg.netfn = 0x3E;
req.msg.cmd = 0x82; /* Set Channel Buffer Length - OEM */ /* Set Channel Buffer Length - OEM */
req.msg.cmd = 0x82;
req.msg.data = msg_data; req.msg.data = msg_data;
req.msg.data_len = 2; req.msg.data_len = 2;
req.msg.lun = 0x00; req.msg.lun = 0x00;
rsp = intf->sendrecv(intf, &req); rsp = intf->sendrecv(intf, &req);
if (rsp == NULL) if (rsp == NULL) {
{
printf("Cannot send large buffer command\n"); printf("Cannot send large buffer command\n");
return(-1); return(-1);
} } else if (rsp->ccode > 0) {
if (rsp->ccode > 0)
{
printf("Invalid length for the selected interface (%s) %d\n", printf("Invalid length for the selected interface (%s) %d\n",
val2str(rsp->ccode, completion_code_vals), rsp->ccode); val2str(rsp->ccode, completion_code_vals), rsp->ccode);
return(-1); return(-1);
@ -250,7 +200,6 @@ int ipmi_kontronoem_send_set_large_buffer(struct ipmi_intf * intf, unsigned char
return 0; return 0;
} }
/* ipmi_fru_set_serial_number - Set the Serial Number in FRU /* ipmi_fru_set_serial_number - Set the Serial Number in FRU
* *
* @intf: ipmi interface * @intf: ipmi interface
@ -260,18 +209,23 @@ int ipmi_kontronoem_send_set_large_buffer(struct ipmi_intf * intf, unsigned char
* returns 1 if successful * returns 1 if successful
*/ */
static int static int
ipmi_kontron_set_serial_number(struct ipmi_intf * intf) ipmi_kontron_set_serial_number(struct ipmi_intf *intf)
{ {
struct fru_header header;
struct fru_info fru;
struct ipmi_rs *rsp; struct ipmi_rs *rsp;
struct ipmi_rq req; struct ipmi_rq req;
struct fru_info fru;
struct fru_header header;
uint8_t msg_data[4];
char *sn; char *sn;
uint8_t sn_size, checksum;
uint8_t *fru_data;
char *fru_area; char *fru_area;
uint32_t fru_data_offset, fru_data_offset_tmp, board_sec_len, prod_sec_len, i; uint8_t checksum;
uint8_t *fru_data;
uint8_t msg_data[4];
uint8_t sn_size;
uint32_t board_sec_len;
uint32_t fru_data_offset;
uint32_t fru_data_offset_tmp;
uint32_t i;
uint32_t prod_sec_len;
sn = NULL; sn = NULL;
fru_data = NULL; fru_data = NULL;
@ -287,83 +241,57 @@ ipmi_kontron_set_serial_number(struct ipmi_intf * intf)
req.msg.cmd = 0x0C; req.msg.cmd = 0x0C;
req.msg.data = msg_data; req.msg.data = msg_data;
req.msg.data_len = 4; req.msg.data_len = 4;
/* Set Lun, necessary for this oem command */ /* Set Lun, necessary for this oem command */
req.msg.lun = 0x03; req.msg.lun = 0x03;
rsp = intf->sendrecv(intf, &req); rsp = intf->sendrecv(intf, &req);
if (rsp == NULL) if (rsp == NULL) {
{
printf(" Device not present (No Response)\n"); printf(" Device not present (No Response)\n");
return -11; return (-1);
} } else if (rsp->ccode > 0) {
if (rsp->ccode > 0)
{
printf(" This option is not implemented for this board\n"); printf(" This option is not implemented for this board\n");
return -1; return (-1);
} }
sn_size = rsp->data_len; sn_size = rsp->data_len;
sn = malloc(sn_size + 1); sn = malloc(sn_size + 1);
if (sn == NULL) {
if(sn == NULL) lprintf(LOG_ERR, "ipmitool: malloc failure");
{ return (-1);
printf("Out of memory!");
return -1;
} }
memset(sn, 0, sn_size + 1); memset(sn, 0, sn_size + 1);
memcpy(sn, rsp->data, sn_size); memcpy(sn, rsp->data, sn_size);
if (verbose >= 1) {
if(verbose >= 1)
{
printf("Original serial number is : [%s]\n", sn); printf("Original serial number is : [%s]\n", sn);
} }
memset(msg_data, 0, 4); memset(msg_data, 0, 4);
msg_data[0] = 0; msg_data[0] = 0;
memset(&req, 0, sizeof(req)); memset(&req, 0, sizeof(req));
req.msg.netfn = IPMI_NETFN_STORAGE; req.msg.netfn = IPMI_NETFN_STORAGE;
req.msg.cmd = GET_FRU_INFO; req.msg.cmd = GET_FRU_INFO;
req.msg.data = msg_data; req.msg.data = msg_data;
req.msg.data_len = 1; req.msg.data_len = 1;
rsp = intf->sendrecv(intf, &req); rsp = intf->sendrecv(intf, &req);
if (rsp == NULL) { if (rsp == NULL) {
printf(" Device not present (No Response)\n"); printf(" Device not present (No Response)\n");
free(sn); free(sn);
sn = NULL; sn = NULL;
return -1; return (-1);
} } else if (rsp->ccode > 0) {
if (rsp->ccode > 0) {
printf(" Device not present (%s)\n", printf(" Device not present (%s)\n",
val2str(rsp->ccode, completion_code_vals)); val2str(rsp->ccode, completion_code_vals));
free(sn); free(sn);
sn = NULL; sn = NULL;
return(-1); return (-1);
} }
memset(&fru, 0, sizeof(fru)); memset(&fru, 0, sizeof(fru));
fru.size = (rsp->data[1] << 8) | rsp->data[0]; fru.size = (rsp->data[1] << 8) | rsp->data[0];
fru.access = rsp->data[2] & 0x1; fru.access = rsp->data[2] & 0x1;
if (fru.size < 1) { if (fru.size < 1) {
printf(" Invalid FRU size %d", fru.size); printf(" Invalid FRU size %d", fru.size);
free(sn); free(sn);
sn = NULL; sn = NULL;
return -1; return (-1);
} }
/* retrieve the FRU header */
/*
* retrieve the FRU header
*/
msg_data[0] = 0; msg_data[0] = 0;
msg_data[1] = 0; msg_data[1] = 0;
msg_data[2] = 0; msg_data[2] = 0;
@ -374,78 +302,58 @@ ipmi_kontron_set_serial_number(struct ipmi_intf * intf)
req.msg.cmd = GET_FRU_DATA; req.msg.cmd = GET_FRU_DATA;
req.msg.data = msg_data; req.msg.data = msg_data;
req.msg.data_len = 4; req.msg.data_len = 4;
rsp = intf->sendrecv(intf, &req); rsp = intf->sendrecv(intf, &req);
if (rsp == NULL) if (rsp == NULL) {
{
printf(" Device not present (No Response)\n"); printf(" Device not present (No Response)\n");
free(sn); free(sn);
sn = NULL; sn = NULL;
return(-1); return (-1);
} } else if (rsp->ccode > 0) {
if (rsp->ccode > 0)
{
printf(" Device not present (%s)\n", printf(" Device not present (%s)\n",
val2str(rsp->ccode, completion_code_vals)); val2str(rsp->ccode, completion_code_vals));
free(sn); free(sn);
sn = NULL; sn = NULL;
return(-1); return (-1);
} }
if (verbose > 1) {
if (verbose > 1)
printbuf(rsp->data, rsp->data_len, "FRU DATA"); printbuf(rsp->data, rsp->data_len, "FRU DATA");
}
memcpy(&header, rsp->data + 1, 8); memcpy(&header, rsp->data + 1, 8);
if (header.version != 1) {
if (header.version != 1)
{
printf(" Unknown FRU header version 0x%02x", printf(" Unknown FRU header version 0x%02x",
header.version); header.version);
free(sn); free(sn);
sn = NULL; sn = NULL;
return(-1); return(-1);
} }
/* Set the Board Section */ /* Set the Board Section */
board_sec_len = (header.offset.product * 8) - (header.offset.board * 8); board_sec_len = (header.offset.product * 8) - (header.offset.board * 8);
fru_data = malloc(fru.size);
if (fru_data == NULL) {
fru_data = malloc( fru.size); lprintf(LOG_ERR, "ipmitool: malloc failure");
if(fru_data == NULL)
{
printf("Out of memory!");
free(sn); free(sn);
sn = NULL; sn = NULL;
return(-1); return (-1);
} }
memset(fru_data, 0, fru.size); memset(fru_data, 0, fru.size);
if(read_fru_area(intf ,&fru ,0 ,(header.offset.board * 8) ,board_sec_len , fru_data) < 0) if (read_fru_area(intf, &fru, 0, (header.offset.board * 8),
{ board_sec_len, fru_data) < 0) {
free(sn); free(sn);
sn = NULL; sn = NULL;
free(fru_data); free(fru_data);
fru_data = NULL; fru_data = NULL;
return(-1); return (-1);
} }
/* Position at Board Manufacturer */
/*Position at Board Manufacturer*/
fru_data_offset = (header.offset.board * 8) + 6; fru_data_offset = (header.offset.board * 8) + 6;
fru_area = get_fru_area_str(fru_data, &fru_data_offset); fru_area = get_fru_area_str(fru_data, &fru_data_offset);
/* Position at Board Product Name */
/*Position at Board Product Name*/
fru_area = get_fru_area_str(fru_data, &fru_data_offset); fru_area = get_fru_area_str(fru_data, &fru_data_offset);
fru_data_offset_tmp = fru_data_offset; fru_data_offset_tmp = fru_data_offset;
/* Position at Serial Number */
/*Position at Serial Number*/
fru_area = get_fru_area_str(fru_data, &fru_data_offset_tmp); fru_area = get_fru_area_str(fru_data, &fru_data_offset_tmp);
fru_data_offset++;
fru_data_offset ++; if (strlen(fru_area) != sn_size) {
if(strlen(fru_area) != sn_size)
{
printf("The length of the serial number in the FRU Board Area is wrong.\n"); printf("The length of the serial number in the FRU Board Area is wrong.\n");
free(sn); free(sn);
sn = NULL; sn = NULL;
@ -453,110 +361,86 @@ ipmi_kontron_set_serial_number(struct ipmi_intf * intf)
fru_data = NULL; fru_data = NULL;
return(-1); return(-1);
} }
/* Copy the new serial number in the board section saved in memory*/ /* Copy the new serial number in the board section saved in memory*/
memcpy(fru_data + fru_data_offset, sn, sn_size); memcpy(fru_data + fru_data_offset, sn, sn_size);
checksum = 0; checksum = 0;
/* Calculate Header Checksum */ /* Calculate Header Checksum */
for( i = (header.offset.board * 8); i < (((header.offset.board * 8)+board_sec_len) - 2) ; i ++ ) for(i = (header.offset.board * 8);
{ i < (((header.offset.board * 8) + board_sec_len) - 2);
i++) {
checksum += fru_data[i]; checksum += fru_data[i];
} }
checksum = (~checksum) + 1; checksum = (~checksum) + 1;
fru_data[(header.offset.board * 8) + board_sec_len - 1] = checksum;
fru_data[(header.offset.board * 8)+board_sec_len - 1] = checksum;
/* Write the new FRU Board section */ /* Write the new FRU Board section */
if(write_fru_area(intf, &fru, 0, (header.offset.board * 8), (header.offset.board * 8), board_sec_len, fru_data) < 0) if (write_fru_area(intf, &fru, 0, (header.offset.board * 8),
{ (header.offset.board * 8),
board_sec_len, fru_data) < 0) {
free(sn); free(sn);
sn = NULL; sn = NULL;
free(fru_data); free(fru_data);
fru_data = NULL; fru_data = NULL;
return(-1); return(-1);
} }
/* Set the Product Section */ /* Set the Product Section */
prod_sec_len = (header.offset.multi * 8) - (header.offset.product * 8); prod_sec_len = (header.offset.multi * 8) - (header.offset.product * 8);
if (read_fru_area(intf, &fru, 0, (header.offset.product * 8),
if(read_fru_area(intf ,&fru ,0 ,(header.offset.product * 8) ,prod_sec_len , fru_data) < 0) prod_sec_len, fru_data) < 0) {
{
free(sn); free(sn);
sn = NULL; sn = NULL;
free(fru_data); free(fru_data);
fru_data = NULL; fru_data = NULL;
return(-1); return(-1);
} }
/* Position at Product Manufacturer */
/*Position at Product Manufacturer*/
fru_data_offset = (header.offset.product * 8) + 3; fru_data_offset = (header.offset.product * 8) + 3;
fru_area = get_fru_area_str(fru_data, &fru_data_offset); fru_area = get_fru_area_str(fru_data, &fru_data_offset);
/* Position at Product Name */
/*Position at Product Name*/
fru_area = get_fru_area_str(fru_data, &fru_data_offset); fru_area = get_fru_area_str(fru_data, &fru_data_offset);
/* Position at Product Part */
/*Position at Product Part*/
fru_area = get_fru_area_str(fru_data, &fru_data_offset); fru_area = get_fru_area_str(fru_data, &fru_data_offset);
/* Position at Product Version */
/*Position at Product Version*/
fru_area = get_fru_area_str(fru_data, &fru_data_offset); fru_area = get_fru_area_str(fru_data, &fru_data_offset);
fru_data_offset_tmp = fru_data_offset; fru_data_offset_tmp = fru_data_offset;
/* Position at Serial Number */
/*Position at Serial Number*/
fru_area = get_fru_area_str(fru_data, &fru_data_offset_tmp); fru_area = get_fru_area_str(fru_data, &fru_data_offset_tmp);
fru_data_offset ++; fru_data_offset ++;
if (strlen(fru_area) != sn_size) {
if(strlen(fru_area) != sn_size)
{
free(sn); free(sn);
sn = NULL; sn = NULL;
free(fru_data); free(fru_data);
fru_data = NULL; fru_data = NULL;
printf("The length of the serial number in the FRU Product Area is wrong.\n"); printf("The length of the serial number in the FRU Product Area is wrong.\n");
return(-1); return(-1);
} }
/* Copy the new serial number in the product section saved in memory*/ /* Copy the new serial number in the product section saved in memory*/
memcpy(fru_data + fru_data_offset, sn, sn_size); memcpy(fru_data + fru_data_offset, sn, sn_size);
checksum = 0; checksum = 0;
/* Calculate Header Checksum */ /* Calculate Header Checksum */
for( i = (header.offset.product * 8); i < (((header.offset.product * 8)+prod_sec_len) - 2) ; i ++ ) for (i = (header.offset.product * 8);
{ i < (((header.offset.product * 8) + prod_sec_len) - 2);
i ++) {
checksum += fru_data[i]; checksum += fru_data[i];
} }
checksum = (~checksum) + 1; checksum = (~checksum) + 1;
fru_data[(header.offset.product * 8)+prod_sec_len - 1] = checksum; fru_data[(header.offset.product * 8)+prod_sec_len - 1] = checksum;
/* Write the new FRU Board section */ /* Write the new FRU Board section */
if(write_fru_area(intf, &fru, 0, (header.offset.product * 8), (header.offset.product * 8), prod_sec_len, fru_data) < 0) if (write_fru_area(intf, &fru, 0, (header.offset.product * 8),
{ (header.offset.product * 8),
prod_sec_len, fru_data) < 0) {
free(sn); free(sn);
sn = NULL; sn = NULL;
free(fru_data); free(fru_data);
fru_data = NULL; fru_data = NULL;
return -1; return -1;
} }
free(sn); free(sn);
sn = NULL; sn = NULL;
free(fru_data); free(fru_data);
fru_data = NULL; fru_data = NULL;
return(1); return(1);
} }
/* ipmi_fru_set_mfg_date - Set the Manufacturing Date in FRU /* ipmi_fru_set_mfg_date - Set the Manufacturing Date in FRU
* *
* @intf: ipmi interface * @intf: ipmi interface
@ -566,20 +450,18 @@ ipmi_kontron_set_serial_number(struct ipmi_intf * intf)
* returns 1 if successful * returns 1 if successful
*/ */
static int static int
ipmi_kontron_set_mfg_date (struct ipmi_intf * intf) ipmi_kontron_set_mfg_date (struct ipmi_intf *intf)
{ {
struct fru_header header;
struct fru_info fru;
struct ipmi_rs *rsp; struct ipmi_rs *rsp;
struct ipmi_rq req; struct ipmi_rq req;
struct fru_info fru; uint8_t *fru_data;
struct fru_header header; uint8_t checksum;
uint8_t msg_data[4]; uint8_t msg_data[4];
uint8_t mfg_date[3]; uint8_t mfg_date[3];
uint32_t board_sec_len;
uint32_t board_sec_len, i; uint32_t i;
uint8_t *fru_data, checksum;
memset(msg_data, 0, 4); memset(msg_data, 0, 4);
msg_data[0] = 0xb4; msg_data[0] = 0xb4;
@ -592,32 +474,22 @@ ipmi_kontron_set_mfg_date (struct ipmi_intf * intf)
req.msg.cmd = 0x0E; req.msg.cmd = 0x0E;
req.msg.data = msg_data; req.msg.data = msg_data;
req.msg.data_len = 4; req.msg.data_len = 4;
/* Set Lun temporary, necessary for this oem command */ /* Set Lun temporary, necessary for this oem command */
req.msg.lun = 0x03; req.msg.lun = 0x03;
rsp = intf->sendrecv(intf, &req); rsp = intf->sendrecv(intf, &req);
if (rsp == NULL) if (rsp == NULL) {
{
printf("Device not present (No Response)\n"); printf("Device not present (No Response)\n");
return(-1); return(-1);
} } else if (rsp->ccode > 0) {
if (rsp->ccode > 0)
{
printf("This option is not implemented for this board\n"); printf("This option is not implemented for this board\n");
return(-1); return(-1);
} }
if (rsp->data_len != 3) {
if(rsp->data_len != 3)
{
printf("Invalid response for the Manufacturing date\n"); printf("Invalid response for the Manufacturing date\n");
return(-1); return(-1);
} }
memset(mfg_date, 0, 3); memset(mfg_date, 0, 3);
memcpy(mfg_date, rsp->data, 3); memcpy(mfg_date, rsp->data, 3);
memset(msg_data, 0, 4); memset(msg_data, 0, 4);
msg_data[0] = 0; msg_data[0] = 0;
@ -626,13 +498,11 @@ ipmi_kontron_set_mfg_date (struct ipmi_intf * intf)
req.msg.cmd = GET_FRU_INFO; req.msg.cmd = GET_FRU_INFO;
req.msg.data = msg_data; req.msg.data = msg_data;
req.msg.data_len = 1; req.msg.data_len = 1;
rsp = intf->sendrecv(intf, &req); rsp = intf->sendrecv(intf, &req);
if (rsp == NULL) { if (rsp == NULL) {
printf(" Device not present (No Response)\n"); printf(" Device not present (No Response)\n");
return(-1); return(-1);
} } else if (rsp->ccode > 0) {
if (rsp->ccode > 0) {
printf(" Device not present (%s)\n", printf(" Device not present (%s)\n",
val2str(rsp->ccode, completion_code_vals)); val2str(rsp->ccode, completion_code_vals));
return(-1); return(-1);
@ -641,15 +511,11 @@ ipmi_kontron_set_mfg_date (struct ipmi_intf * intf)
memset(&fru, 0, sizeof(fru)); memset(&fru, 0, sizeof(fru));
fru.size = (rsp->data[1] << 8) | rsp->data[0]; fru.size = (rsp->data[1] << 8) | rsp->data[0];
fru.access = rsp->data[2] & 0x1; fru.access = rsp->data[2] & 0x1;
if (fru.size < 1) { if (fru.size < 1) {
printf(" Invalid FRU size %d", fru.size); printf(" Invalid FRU size %d", fru.size);
return(-1); return(-1);
} }
/* retrieve the FRU header */
/*
* retrieve the FRU header
*/
msg_data[0] = 0; msg_data[0] = 0;
msg_data[1] = 0; msg_data[1] = 0;
msg_data[2] = 0; msg_data[2] = 0;
@ -660,80 +526,61 @@ ipmi_kontron_set_mfg_date (struct ipmi_intf * intf)
req.msg.cmd = GET_FRU_DATA; req.msg.cmd = GET_FRU_DATA;
req.msg.data = msg_data; req.msg.data = msg_data;
req.msg.data_len = 4; req.msg.data_len = 4;
rsp = intf->sendrecv(intf, &req); rsp = intf->sendrecv(intf, &req);
if (rsp == NULL) if (rsp == NULL) {
{
printf(" Device not present (No Response)\n"); printf(" Device not present (No Response)\n");
return(-1); return (-1);
} } else if (rsp->ccode > 0) {
if (rsp->ccode > 0)
{
printf(" Device not present (%s)\n", printf(" Device not present (%s)\n",
val2str(rsp->ccode, completion_code_vals)); val2str(rsp->ccode, completion_code_vals));
return(-1); return (-1);
} }
if (verbose > 1) {
if (verbose > 1)
printbuf(rsp->data, rsp->data_len, "FRU DATA"); printbuf(rsp->data, rsp->data_len, "FRU DATA");
}
memcpy(&header, rsp->data + 1, 8); memcpy(&header, rsp->data + 1, 8);
if (header.version != 1) {
if (header.version != 1)
{
printf(" Unknown FRU header version 0x%02x", printf(" Unknown FRU header version 0x%02x",
header.version); header.version);
return(-1); return(-1);
} }
board_sec_len = (header.offset.product * 8) - (header.offset.board * 8); board_sec_len = (header.offset.product * 8) - (header.offset.board * 8);
fru_data = malloc(fru.size);
fru_data = malloc( fru.size); if(fru_data == NULL) {
lprintf(LOG_ERR, "ipmitool: malloc failure");
if(fru_data == NULL)
{
printf("Out of memory!");
return(-1); return(-1);
} }
memset(fru_data, 0, fru.size); memset(fru_data, 0, fru.size);
if(read_fru_area(intf ,&fru ,0 ,(header.offset.board * 8) ,board_sec_len , fru_data) < 0) if (read_fru_area(intf ,&fru ,0 ,(header.offset.board * 8),
{ board_sec_len ,fru_data) < 0) {
free(fru_data); free(fru_data);
fru_data = NULL; fru_data = NULL;
return(-1); return(-1);
} }
/* Copy the new manufacturing date in the board section saved in memory*/ /* Copy the new manufacturing date in the board section saved in memory*/
memcpy(fru_data + (header.offset.board * 8) + 3, mfg_date, 3); memcpy(fru_data + (header.offset.board * 8) + 3, mfg_date, 3);
checksum = 0; checksum = 0;
/* Calculate Header Checksum */ /* Calculate Header Checksum */
for( i = (header.offset.board * 8); i < (((header.offset.board * 8)+board_sec_len) - 2) ; i ++ ) for (i = (header.offset.board * 8);
{ i < (((header.offset.board * 8) + board_sec_len) - 2);
i ++ ) {
checksum += fru_data[i]; checksum += fru_data[i];
} }
checksum = (~checksum) + 1; checksum = (~checksum) + 1;
fru_data[(header.offset.board * 8)+board_sec_len - 1] = checksum; fru_data[(header.offset.board * 8)+board_sec_len - 1] = checksum;
/* Write the new FRU Board section */ /* Write the new FRU Board section */
if(write_fru_area(intf, &fru, 0, (header.offset.board * 8), (header.offset.board * 8), board_sec_len, fru_data) < 0) if (write_fru_area(intf, &fru, 0, (header.offset.board * 8),
{ (header.offset.board * 8),
board_sec_len, fru_data) < 0) {
free(fru_data); free(fru_data);
fru_data = NULL; fru_data = NULL;
return(-1); return (-1);
} }
free(fru_data); free(fru_data);
fru_data = NULL; fru_data = NULL;
return(1); return (1);
} }
static char *bootdev[] = {"BIOS", "FDD", "HDD", "CDROM", "network", 0};
static void static void
ipmi_kontron_nextboot_help(void) ipmi_kontron_nextboot_help(void)
{ {
@ -754,7 +601,7 @@ ipmi_kontron_nextboot_help(void)
* returns 1 if successful * returns 1 if successful
*/ */
static int static int
ipmi_kontron_nextboot_set(struct ipmi_intf * intf, int argc, char **argv) ipmi_kontron_nextboot_set(struct ipmi_intf *intf, int argc, char **argv)
{ {
struct ipmi_rs *rsp; struct ipmi_rs *rsp;
struct ipmi_rq req; struct ipmi_rq req;
@ -769,40 +616,32 @@ ipmi_kontron_nextboot_set(struct ipmi_intf * intf, int argc, char **argv)
msg_data[4] = 0x9d; msg_data[4] = 0x9d;
msg_data[5] = 0xFF; msg_data[5] = 0xFF;
msg_data[6] = 0xFF; /* any */ msg_data[6] = 0xFF; /* any */
for (i = 0; bootdev[i] != 0; i++) { for (i = 0; bootdev[i] != 0; i++) {
if (strcmp(argv[0], bootdev[i]) == 0) { if (strcmp(argv[0], bootdev[i]) == 0) {
msg_data[5] = i; msg_data[5] = i;
break; break;
} }
} }
/* Invalid device selected? */ /* Invalid device selected? */
if (msg_data[5] == 0xFF) { if (msg_data[5] == 0xFF) {
printf("Unknown boot device: %s\n", argv[0]); printf("Unknown boot device: %s\n", argv[0]);
return -1; return (-1);
} }
memset(&req, 0, sizeof(req)); memset(&req, 0, sizeof(req));
req.msg.netfn = 0x3E; req.msg.netfn = 0x3E;
req.msg.cmd = 0x02; req.msg.cmd = 0x02;
req.msg.data = msg_data; req.msg.data = msg_data;
req.msg.data_len = 7; req.msg.data_len = 7;
/* Set Lun temporary, necessary for this oem command */ /* Set Lun temporary, necessary for this oem command */
req.msg.lun = 0x03; req.msg.lun = 0x03;
rsp = intf->sendrecv(intf, &req); rsp = intf->sendrecv(intf, &req);
if (rsp == NULL) if (rsp == NULL) {
{
printf("Device not present (No Response)\n"); printf("Device not present (No Response)\n");
return(-1); return(-1);
} } else if (rsp->ccode > 0) {
if (rsp->ccode > 0) {
printf("Device not present (%s)\n", printf("Device not present (%s)\n",
val2str(rsp->ccode, completion_code_vals)); val2str(rsp->ccode, completion_code_vals));
return(-1); return (-1);
} }
return 0; return 0;
} }