mirror of
https://github.com/ipmitool/ipmitool.git
synced 2025-05-10 18:47:22 +00:00
added ENABLE_OPENIPMI_V39_PATCH (not enable by default)
updated to 0.3
This commit is contained in:
parent
18b6d4cc08
commit
8fc8e1a69a
@ -73,6 +73,13 @@
|
|||||||
* - Fixed some typos
|
* - Fixed some typos
|
||||||
* - now uses lprintf()
|
* - now uses lprintf()
|
||||||
*
|
*
|
||||||
|
* - Incremented to version 0.3
|
||||||
|
* - added patch for openipmi si driver V39 (send message in driver does not
|
||||||
|
* retry on 82/83 completion code and return 82/83 as response from target
|
||||||
|
* [conditionnaly built with ENABLE_OPENIPMI_V39_PATCH]
|
||||||
|
*
|
||||||
|
* see: ipmi-fix-send-msg-retry.pacth in openipmi-developer mailing list
|
||||||
|
*
|
||||||
* TODO
|
* TODO
|
||||||
* ===========================================================================
|
* ===========================================================================
|
||||||
* 2007-01-11
|
* 2007-01-11
|
||||||
@ -80,16 +87,6 @@
|
|||||||
* - Add interpretation of GetSelftestResults
|
* - Add interpretation of GetSelftestResults
|
||||||
* - Add interpretation of component ID string
|
* - Add interpretation of component ID string
|
||||||
*
|
*
|
||||||
* KNOWN BUGS
|
|
||||||
* ===========================================================================
|
|
||||||
* 2007-01-11
|
|
||||||
*
|
|
||||||
* - does not work with openipmi si driver v39
|
|
||||||
* send message in driver does not retry on 82/83 completion code and
|
|
||||||
* return 82/83 as response from target
|
|
||||||
*
|
|
||||||
* see: ipmi-fix-send-msg-retry.pacth in openipmi-developer mailing list
|
|
||||||
*
|
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
extern int verbose;
|
extern int verbose;
|
||||||
@ -98,7 +95,7 @@ extern int verbose;
|
|||||||
* Agent version
|
* Agent version
|
||||||
*/
|
*/
|
||||||
#define HPMFWUPG_VERSION_MAJOR 0
|
#define HPMFWUPG_VERSION_MAJOR 0
|
||||||
#define HPMFWUPG_VERSION_MINOR 2
|
#define HPMFWUPG_VERSION_MINOR 3
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* HPM.1 FIRMWARE UPGRADE COMMANDS (part of PICMG)
|
* HPM.1 FIRMWARE UPGRADE COMMANDS (part of PICMG)
|
||||||
@ -129,6 +126,26 @@ extern int verbose;
|
|||||||
#define HPMFWUPG_INV_UPLOAD_MODE 0x82
|
#define HPMFWUPG_INV_UPLOAD_MODE 0x82
|
||||||
#define HPMFWUPG_FW_MISMATCH 0x83
|
#define HPMFWUPG_FW_MISMATCH 0x83
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This error code is used as a temporary PATCH to
|
||||||
|
* the latest Open ipmi driver. This PATCH
|
||||||
|
* will be removed once a new Open IPMI driver is released.
|
||||||
|
* (Buggy version = 39)
|
||||||
|
*/
|
||||||
|
#undef ENABLE_OPENIPMI_V39_PATCH
|
||||||
|
|
||||||
|
#ifdef ENABLE_OPENIPMI_V39_PATCH
|
||||||
|
|
||||||
|
#define RETRY_COUNT_MAX 3
|
||||||
|
|
||||||
|
static int errorCount;
|
||||||
|
|
||||||
|
#define HPMFWUPG_IS_RETRYABLE(error) \
|
||||||
|
((((error==0x83)||(error==0x82)) && (errorCount++<RETRY_COUNT_MAX))?TRUE:FALSE)
|
||||||
|
#else
|
||||||
|
#define HPMFWUPG_IS_RETRYABLE(error) FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* HPM FIRMWARE UPGRADE GENERAL DEFINITIONS
|
* HPM FIRMWARE UPGRADE GENERAL DEFINITIONS
|
||||||
*/
|
*/
|
||||||
@ -608,9 +625,12 @@ typedef enum eHpmfwupgActionType
|
|||||||
|
|
||||||
static int HpmfwupgUpgrade(struct ipmi_intf *intf, char* imageFilename, int activate);
|
static int HpmfwupgUpgrade(struct ipmi_intf *intf, char* imageFilename, int activate);
|
||||||
static int HpmfwupgValidateImageIntegrity(struct HpmfwupgUpgradeCtx* pFwupgCtx);
|
static int HpmfwupgValidateImageIntegrity(struct HpmfwupgUpgradeCtx* pFwupgCtx);
|
||||||
static int HpmfwupgPreparationStage(struct ipmi_intf *intf, struct HpmfwupgUpgradeCtx* pFwupgCtx);
|
static int HpmfwupgPreparationStage(struct ipmi_intf *intf,
|
||||||
static int HpmfwupgUpgradeStage(struct ipmi_intf *intf, struct HpmfwupgUpgradeCtx* pFwupgCtx);
|
struct HpmfwupgUpgradeCtx* pFwupgCtx);
|
||||||
static int HpmfwupgActivationStage(struct ipmi_intf *intf, struct HpmfwupgUpgradeCtx* pFwupgCtx);
|
static int HpmfwupgUpgradeStage(struct ipmi_intf *intf,
|
||||||
|
struct HpmfwupgUpgradeCtx* pFwupgCtx);
|
||||||
|
static int HpmfwupgActivationStage(struct ipmi_intf *intf,
|
||||||
|
struct HpmfwupgUpgradeCtx* pFwupgCtx);
|
||||||
static int HpmfwupgGetTargetUpgCapabilities(struct ipmi_intf *intf,
|
static int HpmfwupgGetTargetUpgCapabilities(struct ipmi_intf *intf,
|
||||||
struct HpmfwupgGetTargetUpgCapabilitiesCtx* pCtx);
|
struct HpmfwupgGetTargetUpgCapabilitiesCtx* pCtx);
|
||||||
static int HpmfwupgGetComponentProperties(struct ipmi_intf *intf,
|
static int HpmfwupgGetComponentProperties(struct ipmi_intf *intf,
|
||||||
@ -624,9 +644,11 @@ static int HpmfwupgQueryRollbackStatus(struct ipmi_intf *intf,
|
|||||||
static int HpmfwupgPrepareComponents(struct ipmi_intf *intf,
|
static int HpmfwupgPrepareComponents(struct ipmi_intf *intf,
|
||||||
struct HpmfwupgPrepareComponentsCtx* pCtx,
|
struct HpmfwupgPrepareComponentsCtx* pCtx,
|
||||||
struct HpmfwupgUpgradeCtx* pFwupgCtx);
|
struct HpmfwupgUpgradeCtx* pFwupgCtx);
|
||||||
|
|
||||||
static int HpmfwupgBackupComponents(struct ipmi_intf *intf,
|
static int HpmfwupgBackupComponents(struct ipmi_intf *intf,
|
||||||
struct HpmfwupgBackupComponentsCtx* pCtx,
|
struct HpmfwupgBackupComponentsCtx* pCtx,
|
||||||
struct HpmfwupgUpgradeCtx* pFwupgCtx);
|
struct HpmfwupgUpgradeCtx* pFwupgCtx);
|
||||||
|
|
||||||
static int HpmfwupgUploadFirmwareBlock(struct ipmi_intf *intf,
|
static int HpmfwupgUploadFirmwareBlock(struct ipmi_intf *intf,
|
||||||
struct HpmfwupgUploadFirmwareBlockCtx* pCtx,
|
struct HpmfwupgUploadFirmwareBlockCtx* pCtx,
|
||||||
struct HpmfwupgUpgradeCtx* pFwupgCtx, int count);
|
struct HpmfwupgUpgradeCtx* pFwupgCtx, int count);
|
||||||
@ -1592,11 +1614,21 @@ int HpmfwupgUploadFirmwareBlock(struct ipmi_intf *intf, struct HpmfwupgUploadFir
|
|||||||
*/
|
*/
|
||||||
else if ( (rsp->ccode != 0x00) && (rsp->ccode != 0xcc) )
|
else if ( (rsp->ccode != 0x00) && (rsp->ccode != 0xcc) )
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* PATCH --> This validation is to handle retryables errors codes on IPMB bus.
|
||||||
|
* This will be fixed in the next release of open ipmi and this
|
||||||
|
* check will have to be removed. (Buggy version = 39)
|
||||||
|
*/
|
||||||
|
if ( HPMFWUPG_IS_RETRYABLE(rsp->ccode) )
|
||||||
|
{
|
||||||
|
lprintf(LOG_DEBUG,"HPM: [PATCH]Retryable error detected");
|
||||||
|
rc = HPMFWUPG_UPLOAD_RETRY;
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* If completion code = 0xc7, we will retry with a reduced buffer length.
|
* If completion code = 0xc7, we will retry with a reduced buffer length.
|
||||||
* Do not print error.
|
* Do not print error.
|
||||||
*/
|
*/
|
||||||
if ( rsp->ccode == IPMI_CC_REQ_DATA_INV_LENGTH )
|
else if ( rsp->ccode == IPMI_CC_REQ_DATA_INV_LENGTH )
|
||||||
{
|
{
|
||||||
rc = HPMFWUPG_UPLOAD_BLOCK_LENGTH;
|
rc = HPMFWUPG_UPLOAD_BLOCK_LENGTH;
|
||||||
}
|
}
|
||||||
@ -1734,6 +1766,17 @@ int HpmfwupgGetUpgradeStatus(struct ipmi_intf *intf, struct HpmfwupgGetUpgradeSt
|
|||||||
lprintf(LOG_NOTICE," Last command completion code: %x", pCtx->resp.lastCmdCompCode);
|
lprintf(LOG_NOTICE," Last command completion code: %x", pCtx->resp.lastCmdCompCode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
* PATCH --> This validation is to handle retryables errors codes on IPMB bus.
|
||||||
|
* This will be fixed in the next release of open ipmi and this
|
||||||
|
* check will have to be removed. (Buggy version = 39)
|
||||||
|
*/
|
||||||
|
else if ( HPMFWUPG_IS_RETRYABLE(rsp->ccode) )
|
||||||
|
{
|
||||||
|
lprintf(LOG_DEBUG,"HPM: [PATCH]Retryable error detected");
|
||||||
|
|
||||||
|
pCtx->resp.lastCmdCompCode = HPMFWUPG_COMMAND_IN_PROGRESS;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if ( verbose )
|
if ( verbose )
|
||||||
@ -1833,6 +1876,19 @@ int HpmfwupgQueryRollbackStatus(struct ipmi_intf *intf, struct HpmfwupgQueryRoll
|
|||||||
/* Must wait at least 100 ms between status requests */
|
/* Must wait at least 100 ms between status requests */
|
||||||
usleep(100000);
|
usleep(100000);
|
||||||
rsp = HpmfwupgSendCmd(intf, req, pFwupgCtx);
|
rsp = HpmfwupgSendCmd(intf, req, pFwupgCtx);
|
||||||
|
/*
|
||||||
|
* PATCH --> This validation is to handle retryables errors codes on IPMB bus.
|
||||||
|
* This will be fixed in the next release of open ipmi and this
|
||||||
|
* check will have to be removed. (Buggy version = 39)
|
||||||
|
*/
|
||||||
|
if ( rsp )
|
||||||
|
{
|
||||||
|
if ( HPMFWUPG_IS_RETRYABLE(rsp->ccode) )
|
||||||
|
{
|
||||||
|
lprintf(LOG_DEBUG,"HPM: [PATCH]Retryable error detected");
|
||||||
|
rsp->ccode = HPMFWUPG_COMMAND_IN_PROGRESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
timeoutSec2 = time(NULL);
|
timeoutSec2 = time(NULL);
|
||||||
|
|
||||||
}while( rsp &&
|
}while( rsp &&
|
||||||
@ -1918,6 +1974,19 @@ int HpmfwupgQuerySelftestResult(struct ipmi_intf *intf, struct HpmfwupgQuerySelf
|
|||||||
/* Must wait at least 100 ms between status requests */
|
/* Must wait at least 100 ms between status requests */
|
||||||
usleep(100000);
|
usleep(100000);
|
||||||
rsp = HpmfwupgSendCmd(intf, req, pFwupgCtx);
|
rsp = HpmfwupgSendCmd(intf, req, pFwupgCtx);
|
||||||
|
/*
|
||||||
|
* PATCH --> This validation is to handle retryables errors codes on IPMB bus.
|
||||||
|
* This will be fixed in the next release of open ipmi and this
|
||||||
|
* check will have to be removed. (Buggy version = 39)
|
||||||
|
*/
|
||||||
|
if ( rsp )
|
||||||
|
{
|
||||||
|
if ( HPMFWUPG_IS_RETRYABLE(rsp->ccode) )
|
||||||
|
{
|
||||||
|
lprintf(LOG_DEBUG,"HPM: [PATCH]Retryable error detected");
|
||||||
|
rsp->ccode = HPMFWUPG_COMMAND_IN_PROGRESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
timeoutSec2 = time(NULL);
|
timeoutSec2 = time(NULL);
|
||||||
|
|
||||||
}while( rsp &&
|
}while( rsp &&
|
||||||
@ -2062,6 +2131,12 @@ struct ipmi_rs * HpmfwupgSendCmd(struct ipmi_intf *intf, struct ipmi_rq req,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
#ifdef ENABLE_OPENIPMI_V39_PATCH
|
||||||
|
if( rsp->ccode == IPMI_CC_OK )
|
||||||
|
{
|
||||||
|
errorCount = 0 ;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
retry = 0;
|
retry = 0;
|
||||||
}
|
}
|
||||||
}while( retry );
|
}while( retry );
|
||||||
|
Loading…
x
Reference in New Issue
Block a user