Update write_fru_area Api so both upgEkey and fru write works properly

also added some comments. And change some printf to lprintf
 - added soffset(source offset) and doffset(destination) parameters to write_fru_area
This commit is contained in:
Francois Isabelle 2005-07-26 14:40:23 +00:00
parent cfd7f610cb
commit e25e0b8e71

View File

@ -178,21 +178,35 @@ get_fru_area_str(uint8_t * data, uint32_t * offset)
return str; return str;
} }
/* write_fru_area - write fru data
*
* @intf: ipmi interface
* @fru_info: information about FRU device
* @id : Fru id
* @soffset : Source offset (from buffer)
* @doffset : Destination offset (in device)
* @length : Size of data to write (in bytes)
* @pFrubuf : Pointer on data to write
*
* returns 0 on success
* returns -1 on error
*/
static int static int
write_fru_area(struct ipmi_intf * intf, struct fru_info *fru, unsigned char id, write_fru_area(struct ipmi_intf * intf, struct fru_info *fru, unsigned char id,
unsigned int offset, unsigned int length, unsigned char *pFrubuf) unsigned int soffset, unsigned int doffset,
unsigned int length, unsigned char *pFrubuf)
{ /* { /*
// fill in frubuf[offset:length] from the FRU[offset:length] // fill in frubuf[offset:length] from the FRU[offset:length]
// rc=1 on success // rc=1 on success
*/ */
static unsigned int fru_data_rqst_size = 20; static unsigned int fru_data_rqst_size = 32;
unsigned int off = offset, tmp, finish; unsigned int off=0, tmp, finish;
struct ipmi_rs * rsp; struct ipmi_rs * rsp;
struct ipmi_rq req; struct ipmi_rq req;
unsigned char msg_data[25]; unsigned char msg_data[25];
unsigned char writeLength; unsigned char writeLength;
finish = offset + length; finish = doffset + length; /* destination offset */
if (finish > fru->size) if (finish > fru->size)
{ {
printf("Return error\n"); printf("Return error\n");
@ -203,26 +217,26 @@ write_fru_area(struct ipmi_intf * intf, struct fru_info *fru, unsigned char id,
req.msg.cmd = SET_FRU_DATA; req.msg.cmd = SET_FRU_DATA;
req.msg.data = msg_data; req.msg.data = msg_data;
if (fru->access && fru_data_rqst_size > 16) if (fru->access && fru_data_rqst_size > 16)
fru_data_rqst_size = 16; fru_data_rqst_size = 16;
do do
{ {
tmp = fru->access ? off >> 1 : off; /* real destination offset */
tmp = fru->access ? (doffset+off) >> 1 : (doffset+off);
msg_data[0] = id; msg_data[0] = id;
msg_data[1] = (unsigned char)tmp; msg_data[1] = (unsigned char)tmp;
msg_data[2] = (unsigned char)(tmp >> 8); msg_data[2] = (unsigned char)(tmp >> 8);
tmp = finish - off; tmp = finish - (doffset+off); /* bytes remaining */
if (tmp > 16) if (tmp > 16)
{ {
printf("Writting 16 bytes\n"); lprintf(LOG_INFO,"Writting 16 bytes");
memcpy(&msg_data[3],(pFrubuf+(off-offset)), 16); memcpy(&msg_data[3],(pFrubuf+soffset+off), 16);
req.msg.data_len = 16 + 3; req.msg.data_len = 16 + 3;
} }
else else
{ {
printf("Writting %d bytes\n", tmp); lprintf(LOG_INFO,"Writting %d bytes", tmp);
memcpy(&msg_data[3],(pFrubuf+(off-offset)), (unsigned char) tmp); memcpy(&msg_data[3],(pFrubuf+soffset+off), (unsigned char) tmp);
req.msg.data_len = tmp + 3; req.msg.data_len = tmp + 3;
} }
@ -233,19 +247,18 @@ write_fru_area(struct ipmi_intf * intf, struct fru_info *fru, unsigned char id,
break; break;
if ((rsp->ccode==0xc7 || rsp->ccode==0xc8 || rsp->ccode==0xca ) && --fru_data_rqst_size > 8) if ((rsp->ccode==0xc7 || rsp->ccode==0xc8 || rsp->ccode==0xca ) && --fru_data_rqst_size > 8)
{ {
printf("Bad CC -> %x\n", rsp->ccode); lprintf(LOG_NOTICE,"Bad CC -> %x\n", rsp->ccode);
break; /*continue;*/ break; /*continue;*/
} }
if (rsp->ccode) if (rsp->ccode)
break; break;
off += writeLength; off += writeLength;
} while (off < finish); } while ((doffset+off) < finish);
return (off >= finish); return ((doffset+off) >= finish);
} }
/* read_fru_area - fill in frubuf[offset:length] from the FRU[offset:length] /* read_fru_area - fill in frubuf[offset:length] from the FRU[offset:length]
* *
* @intf: ipmi interface * @intf: ipmi interface
@ -1485,47 +1498,39 @@ static void ipmi_fru_write_from_bin(struct ipmi_intf * intf,
if (!rsp) if (!rsp)
return; return;
if(rsp->ccode) if (rsp->ccode) {
{
if (rsp->ccode == 0xc3) if (rsp->ccode == 0xc3)
printf (" Timeout accessing FRU info. (Device not present?)\n"); printf
(" Timeout accessing FRU info. (Device not present?)\n");
return; return;
} }
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 (verbose) if (verbose) {
{
printf("Fru Size = %d bytes\n", fru.size); printf("Fru Size = %d bytes\n", fru.size);
printf("Fru Access = %xh\n", fru.access); printf("Fru Access = %xh\n", fru.access);
} }
pFruBuf = malloc(fru.size); pFruBuf = malloc(fru.size);
if(pFruBuf != NULL) if (pFruBuf != NULL) {
{
FILE *pFile; FILE *pFile;
pFile = fopen(pFileName, "rb"); pFile = fopen(pFileName, "rb");
if(pFile!=NULL) if (pFile != NULL) {
{
len = fread(pFruBuf, 1, fru.size, pFile); len = fread(pFruBuf, 1, fru.size, pFile);
printf("Fru Size : %d bytes\n", fru.size); printf("Fru Size : %d bytes\n", fru.size);
printf("Size to Write : %d bytes\n", len); printf("Size to Write : %d bytes\n", len);
fclose(pFile); fclose(pFile);
} } else {
else
{
fprintf(stderr, "Error opening file %s\n", pFileName); fprintf(stderr, "Error opening file %s\n", pFileName);
} }
if(len != 0) if (len != 0) {
{ write_fru_area(intf, &fru, fruId,0, 0, len, pFruBuf);
write_fru_area(intf, &fru, fruId, 0, len, pFruBuf); lprintf(LOG_INFO,"Done");
printf("Done\n\r");
} }
} } else {
else
{
fprintf(stderr, "Cannot allocate %d bytes\n", fru.size); fprintf(stderr, "Cannot allocate %d bytes\n", fru.size);
} }
free(pFruBuf); free(pFruBuf);
@ -1544,52 +1549,56 @@ ipmi_fru_upg_ekeying(struct ipmi_intf * intf,unsigned char * pFileName,
unsigned char *buf = NULL; unsigned char *buf = NULL;
retStatus = retStatus =
ipmi_fru_get_multirec_location_from_fru(intf, fruId, &fruInfo, ipmi_fru_get_multirec_location_from_fru(intf, fruId, &fruInfo,
&offFruMultiRec, &fruMultiRecSize); &offFruMultiRec,
&fruMultiRecSize);
if(verbose) if (verbose) {
{
printf("FRU Size : %u\n\r", fruMultiRecSize); printf("FRU Size : %u\n\r", fruMultiRecSize);
printf("Multi Rec offset: %u\n\r", offFruMultiRec); printf("Multi Rec offset: %u\n\r", offFruMultiRec);
} }
if(retStatus == 0) if (retStatus == 0) {
{
retStatus = retStatus =
ipmi_fru_get_multirec_size_from_file(pFileName,&fileMultiRecSize, ipmi_fru_get_multirec_size_from_file(pFileName,
&fileMultiRecSize,
&offFileMultiRec); &offFileMultiRec);
} }
if (retStatus == 0) {
if(retStatus == 0)
{
buf = malloc(fileMultiRecSize); buf = malloc(fileMultiRecSize);
if(buf) if (buf) {
{
retStatus = retStatus =
ipmi_fru_get_multirec_from_file(pFileName,buf,fileMultiRecSize, ipmi_fru_get_multirec_from_file(pFileName, buf,
fileMultiRecSize,
offFileMultiRec); offFileMultiRec);
} } else {
else
{
printf("Error allocating memory for multirec buffer\n"); printf("Error allocating memory for multirec buffer\n");
retStatus = -1; retStatus = -1;
} }
} }
ipmi_fru_get_adjust_size_from_buffer(buf, &fileMultiRecSize); if(retStatus == 0)
if((retStatus == 0) && (buf))
{ {
write_fru_area(intf, &fruInfo, fruId, offFruMultiRec, fileMultiRecSize, ipmi_fru_get_adjust_size_from_buffer(buf, &fileMultiRecSize);
buf); }
if ((retStatus == 0) && (buf)) {
write_fru_area(intf, &fruInfo, fruId, 0, offFruMultiRec,
fileMultiRecSize, buf);
} }
if(buf) if (buf) {
{
free(buf); free(buf);
} }
if(retStatus == 0 )
{
lprintf(LOG_INFO, "Done");
}
else
{
lprintf(LOG_ERR, "Failed");
}
} }
static int ipmi_fru_get_multirec_size_from_file(unsigned char * pFileName, static int ipmi_fru_get_multirec_size_from_file(unsigned char * pFileName,