ID: 46 - ipmi_fwum needs some re-work

KfwumSaveFirmwareImage() - formatting, clean-up

Commit cleans up formatting, code and, hopefully, simplifies
KfwumSaveFirmwareImage().
This commit is contained in:
Zdenek Styblik 2013-10-26 19:08:12 +00:00
parent f12b976ebc
commit 5a1e81a948

View File

@ -946,145 +946,97 @@ struct KfwumSaveFirmwareSequenceReq
#endif #endif
#define FWUM_SAVE_FIRMWARE_NO_RESPONSE_LIMIT ((unsigned char)6) # define FWUM_SAVE_FIRMWARE_NO_RESPONSE_LIMIT 6
static tKFWUM_Status KfwumSaveFirmwareImage(struct ipmi_intf * intf, static tKFWUM_Status KfwumSaveFirmwareImage(struct ipmi_intf * intf,
unsigned char sequenceNumber, unsigned long address, unsigned char *pFirmBuf, unsigned char sequenceNumber, unsigned long address,
unsigned char * pInBufLength) unsigned char *pFirmBuf, unsigned char *pInBufLength)
{ {
tKFWUM_Status status = KFWUM_STATUS_OK; tKFWUM_Status status = KFWUM_STATUS_OK;
struct ipmi_rs * rsp; struct ipmi_rs *rsp;
struct ipmi_rq req; struct ipmi_rq req;
unsigned char out = 0; struct KfwumSaveFirmwareAddressReq addr_req;
unsigned char retry = 0; struct KfwumSaveFirmwareSequenceReq seq_req;
unsigned char noResponse = 0 ; int retry = 0;
int no_rsp = 0;
struct KfwumSaveFirmwareAddressReq addressReq; do {
struct KfwumSaveFirmwareSequenceReq sequenceReq; memset(&req, 0, sizeof(req));
req.msg.netfn = IPMI_NETFN_FIRMWARE;
do req.msg.cmd = KFWUM_CMD_ID_SAVE_FIRMWARE_IMAGE;
{ if (saveFirmwareInfo.downloadType == KFWUM_DOWNLOAD_TYPE_ADDRESS) {
memset(&req, 0, sizeof(req)); addr_req.addressLSB = address & 0x000000ff;
req.msg.netfn = IPMI_NETFN_FIRMWARE; addr_req.addressMid = (address >> 8) & 0x000000ff;
req.msg.cmd = KFWUM_CMD_ID_SAVE_FIRMWARE_IMAGE; addr_req.addressMSB = (address >> 16) & 0x000000ff;
addr_req.numBytes = *pInBufLength;
if (saveFirmwareInfo.downloadType == KFWUM_DOWNLOAD_TYPE_ADDRESS ) memcpy(addr_req.txBuf, pFirmBuf, *pInBufLength);
{ req.msg.data = (unsigned char *)&addr_req;
addressReq.addressLSB = address & 0x000000ff; req.msg.data_len = *pInBufLength + 4;
addressReq.addressMid = (address >> 8) & 0x000000ff; } else {
addressReq.addressMSB = (address >> 16) & 0x000000ff; seq_req.sequenceNumber = sequenceNumber;
addressReq.numBytes = (* pInBufLength); memcpy(seq_req.txBuf, pFirmBuf, *pInBufLength);
memcpy(addressReq.txBuf, pFirmBuf, (* pInBufLength)); req.msg.data = (unsigned char *)&seq_req;
req.msg.data = (unsigned char *) &addressReq; req.msg.data_len = *pInBufLength + sizeof(unsigned char);
req.msg.data_len = (* pInBufLength)+4; /* + 1 => sequenceNumber*/
} }
else rsp = intf->sendrecv(intf, &req);
{ if (rsp == NULL) {
sequenceReq.sequenceNumber = sequenceNumber; lprintf(LOG_ERR,
memcpy(sequenceReq.txBuf, pFirmBuf, (* pInBufLength)); "Error in FWUM Firmware Save Firmware Image Download Command.");
req.msg.data = (unsigned char *) &sequenceReq; /* We don't receive "C7" on errors with IOL,
req.msg.data_len = (* pInBufLength)+sizeof(unsigned char); /* + 1 => sequenceNumber*/ * instead we receive nothing
} */
if (strstr(intf->name, "lan") != NULL) {
rsp = intf->sendrecv(intf, &req); no_rsp++;
if (no_rsp < FWUM_SAVE_FIRMWARE_NO_RESPONSE_LIMIT) {
if (!rsp) *pInBufLength -= 1;
{ continue;
printf("Error in FWUM Firmware Save Firmware Image Download Command\n"); }
lprintf(LOG_ERR,
out = 0; "Error, too many commands without response.");
status = KFWUM_STATUS_OK; *pInBufLength = 0;
break;
/* With IOL, we don't receive "C7" on errors, instead we receive } /* For other interface keep trying */
nothing */ } else if (rsp->ccode != 0) {
if(strstr(intf->name,"lan")!= NULL) if (rsp->ccode == 0xc0) {
{ sleep(1);
noResponse++; } else if ((rsp->ccode == 0xc7)
|| ((rsp->ccode == 0xc3)
if(noResponse < FWUM_SAVE_FIRMWARE_NO_RESPONSE_LIMIT ) && (sequenceNumber == 0))) {
{ *pInBufLength -= 1;
(* pInBufLength) -= 1; retry = 1;
out = 0; } else if (rsp->ccode == 0x82) {
} /* Double sent, continue */
else status = KFWUM_STATUS_OK;
{ break;
printf("Error, too many commands without response\n"); } else if (rsp->ccode == 0x83) {
(* pInBufLength) = 0 ; if (retry == 0) {
out = 1; retry = 1;
} continue;
} /* For other interface keep trying */ }
} status = KFWUM_STATUS_ERROR;
else if (rsp->ccode) break;
{ } else if (rsp->ccode == 0xcf) {
if(rsp->ccode == 0xc0) /* Ok if receive duplicated request */
{ retry = 1;
status = KFWUM_STATUS_OK; } else if (rsp->ccode == 0xc3) {
sleep(1); if (retry == 0) {
} retry = 1;
else if( continue;
(rsp->ccode == 0xc7) }
|| status = KFWUM_STATUS_ERROR;
( break;
(rsp->ccode == 0xC3) && } else {
(sequenceNumber == 0) lprintf(LOG_ERR,
) "FWUM Firmware Save Firmware Image Download returned %x",
) rsp->ccode);
{ status = KFWUM_STATUS_ERROR;
(* pInBufLength) -= 1; break;
status = KFWUM_STATUS_OK; }
retry = 1; } else {
} break;
else if(rsp->ccode == 0x82) }
{ } while (1);
/* Double sent, continue */ return status;
status = KFWUM_STATUS_OK;
out = 1;
}
else if(rsp->ccode == 0x83)
{
if(retry == 0)
{
retry = 1;
status = KFWUM_STATUS_OK;
}
else
{
status = KFWUM_STATUS_ERROR;
out = 1;
}
}
else if(rsp->ccode == 0xcf) /* Ok if receive duplicated request */
{
retry = 1;
status = KFWUM_STATUS_OK;
}
else if(rsp->ccode == 0xC3)
{
if(retry == 0)
{
retry = 1;
status = KFWUM_STATUS_OK;
}
else
{
status = KFWUM_STATUS_ERROR;
out = 1;
}
}
else
{
printf("FWUM Firmware Save Firmware Image Download returned %x\n",
rsp->ccode);
status = KFWUM_STATUS_ERROR;
out = 1;
}
}
else
{
out = 1;
}
}while(out == 0);
return status;
} }
#ifdef HAVE_PRAGMA_PACK #ifdef HAVE_PRAGMA_PACK