mirror of
https://github.com/ipmitool/ipmitool.git
synced 2025-05-10 18:47:22 +00:00
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:
parent
f12b976ebc
commit
5a1e81a948
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user