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