mirror of
https://github.com/ipmitool/ipmitool.git
synced 2025-05-10 18:47:22 +00:00
- Update to be compliant with new HPM.1 specification 1.0 (Official release)
- First commit that support HPM.1 Rev 1.0
This commit is contained in:
parent
07c3456330
commit
e655394a7a
@ -53,13 +53,7 @@
|
||||
* IPM Controller Firmware Upgrade Procedure
|
||||
*
|
||||
* This module implements an Upgrade Agent for the IPM Controller
|
||||
* Firmware Upgrade Procedure (HPM.1) specification version draft 0.9.
|
||||
*
|
||||
* DISCLAIMER: This module is in constant evolution and based on a non-official
|
||||
* specification release. It also may not fulfill all the Upgrade
|
||||
* Agent requirements defined in the spec. However, all the command
|
||||
* and procedures implemented are compliant to the specification
|
||||
* specified.
|
||||
* Firmware Upgrade Procedure (HPM.1) specification version 1.0.
|
||||
*
|
||||
* author:
|
||||
* Frederic.Lelievre@ca.kontron.com
|
||||
@ -92,6 +86,11 @@
|
||||
* get the final firmware upgrade status.
|
||||
* - Fixed some user interface stuff.
|
||||
*
|
||||
* 2007-05-09
|
||||
*
|
||||
* - Incremented to version 1.0
|
||||
* - Modifications for compliancy with HPM.1 specification version 1.0
|
||||
*
|
||||
* TODO
|
||||
* ===========================================================================
|
||||
* 2007-01-11
|
||||
@ -106,8 +105,8 @@ extern int verbose;
|
||||
/*
|
||||
* Agent version
|
||||
*/
|
||||
#define HPMFWUPG_VERSION_MAJOR 0
|
||||
#define HPMFWUPG_VERSION_MINOR 4
|
||||
#define HPMFWUPG_VERSION_MAJOR 1
|
||||
#define HPMFWUPG_VERSION_MINOR 0
|
||||
|
||||
/*
|
||||
* HPM.1 FIRMWARE UPGRADE COMMANDS (part of PICMG)
|
||||
@ -115,8 +114,8 @@ extern int verbose;
|
||||
|
||||
#define HPMFWUPG_GET_TARGET_UPG_CAPABILITIES 0x2E
|
||||
#define HPMFWUPG_GET_COMPONENT_PROPERTIES 0x2F
|
||||
#define HPMFWUPG_BACKUP_COMPONENTS 0x30
|
||||
#define HPMFWUPG_PREPARE_COMPONENTS 0x31
|
||||
#define HPMFWUPG_ABORT_UPGRADE 0x30
|
||||
#define HPMFWUPG_INITIATE_UPGRADE_ACTION 0x31
|
||||
#define HPMFWUPG_UPLOAD_FIRMWARE_BLOCK 0x32
|
||||
#define HPMFWUPG_FINISH_FIRMWARE_UPLOAD 0x33
|
||||
#define HPMFWUPG_GET_UPGRADE_STATUS 0x34
|
||||
@ -126,17 +125,22 @@ extern int verbose;
|
||||
#define HPMFWUPG_MANUAL_FIRMWARE_ROLLBACK 0x38
|
||||
|
||||
/*
|
||||
* HPM.1 SPECIFIC ERROR CODES
|
||||
* HPM.1 SPECIFIC COMPLETION CODES
|
||||
*/
|
||||
#define HPMFWUPG_ROLLBACK_COMPLETED 0x00
|
||||
#define HPMFWUPG_COMMAND_IN_PROGRESS 0x80
|
||||
#define HPMFWUPG_INV_COMP_ID 0x81
|
||||
#define HPMFWUPG_NOT_SUPPORTED 0x81
|
||||
#define HPMFWUPG_SIZE_MISMATCH 0x81
|
||||
#define HPMFWUPG_ROLLBACK_FAILURE 0x81
|
||||
#define HPMFWUPG_INV_COMP_PROP 0x82
|
||||
#define HPMFWUPG_INV_COMP_MASK 0x81
|
||||
#define HPMFWUPG__ABORT_FAILURE 0x81
|
||||
#define HPMFWUPG_INV_COMP_ID 0x82
|
||||
#define HPMFWUPG_INT_CHECKSUM_ERROR 0x82
|
||||
#define HPMFWUPG_INV_UPLOAD_MODE 0x82
|
||||
#define HPMFWUPG_ROLLBACK_OVERRIDE 0x82
|
||||
#define HPMFWUPG_INV_COMP_PROP 0x83
|
||||
#define HPMFWUPG_FW_MISMATCH 0x83
|
||||
#define HPMFWUPG_ROLLBACK_DENIED 0x83
|
||||
|
||||
/*
|
||||
* This error code is used as a temporary PATCH to
|
||||
@ -144,7 +148,7 @@ extern int verbose;
|
||||
* will be removed once a new Open IPMI driver is released.
|
||||
* (Buggy version = 39)
|
||||
*/
|
||||
#undef ENABLE_OPENIPMI_V39_PATCH
|
||||
#define ENABLE_OPENIPMI_V39_PATCH
|
||||
|
||||
#ifdef ENABLE_OPENIPMI_V39_PATCH
|
||||
|
||||
@ -234,29 +238,30 @@ struct HpmfwupgGetTargetUpgCapabilitiesReq
|
||||
struct HpmfwupgGetTargetUpgCapabilitiesResp
|
||||
{
|
||||
unsigned char picmgId;
|
||||
unsigned char hpmVersion;
|
||||
union
|
||||
{
|
||||
unsigned char byte;
|
||||
struct
|
||||
{
|
||||
#if WORDS_BIGENDIAN
|
||||
unsigned char reserved : 1;
|
||||
unsigned char payloadAffected : 1;
|
||||
unsigned char fwUpgUndesirable : 1;
|
||||
unsigned char autRollbackOverride : 1;
|
||||
unsigned char ipmcDegradedDurinUpg: 1;
|
||||
unsigned char deferActivation : 1;
|
||||
unsigned char servAffectDuringUpg : 1;
|
||||
unsigned char manualRollback : 1;
|
||||
unsigned char ipmcDeferActivation : 1;
|
||||
unsigned char ipmcRollback : 1;
|
||||
unsigned char ipmcSelftest : 1;
|
||||
unsigned char ipmbbAccess : 1;
|
||||
unsigned char ipmbaAccess : 1;
|
||||
unsigned char autRollback : 1;
|
||||
unsigned char ipmcSelftestCap : 1;
|
||||
#else
|
||||
unsigned char ipmbaAccess : 1;
|
||||
unsigned char ipmbbAccess : 1;
|
||||
unsigned char ipmcSelftest : 1;
|
||||
unsigned char ipmcRollback : 1;
|
||||
unsigned char ipmcDeferActivation : 1;
|
||||
unsigned char ipmcSelftestCap : 1;
|
||||
unsigned char autRollback : 1;
|
||||
unsigned char manualRollback : 1;
|
||||
unsigned char payloadAffected : 1;
|
||||
unsigned char reserved : 1;
|
||||
unsigned char servAffectDuringUpg : 1;
|
||||
unsigned char deferActivation : 1;
|
||||
unsigned char ipmcDegradedDurinUpg: 1;
|
||||
unsigned char autRollbackOverride : 1;
|
||||
unsigned char fwUpgUndesirable : 1;
|
||||
#endif
|
||||
}bitField;
|
||||
}GlobalCapabilities;
|
||||
@ -281,7 +286,6 @@ typedef enum eHpmfwupgCompPropertiesSelect
|
||||
{
|
||||
HPMFWUPG_COMP_GEN_PROPERTIES = 0,
|
||||
HPMFWUPG_COMP_CURRENT_VERSION,
|
||||
HPMFWUPG_COMP_GROUPING_ID,
|
||||
HPMFWUPG_COMP_DESCRIPTION_STRING,
|
||||
HPMFWUPG_COMP_ROLLBACK_FIRMWARE_VERSION,
|
||||
HPMFWUPG_COMP_DEFERRED_FIRMWARE_VERSION,
|
||||
@ -305,21 +309,19 @@ struct HpmfwupgGetGeneralPropResp
|
||||
struct
|
||||
{
|
||||
#if WORDS_BIGENDIAN
|
||||
unsigned char reserved : 2;
|
||||
unsigned char payloadColdReset : 1;
|
||||
unsigned char deferredActivation : 1;
|
||||
unsigned char validationSupport : 1;
|
||||
unsigned char comparisonSupport : 1;
|
||||
unsigned char preparationSupport : 1;
|
||||
unsigned char rollbackBackup : 2;
|
||||
unsigned char ipmbbAccess : 1;
|
||||
unsigned char ipmbaAccess : 1;
|
||||
#else
|
||||
unsigned char ipmbaAccess : 1;
|
||||
unsigned char ipmbbAccess : 1;
|
||||
unsigned char rollbackBackup : 2;
|
||||
unsigned char preparationSupport : 1;
|
||||
unsigned char validationSupport : 1;
|
||||
unsigned char comparisonSupport : 1;
|
||||
unsigned char deferredActivation : 1;
|
||||
unsigned char payloadColdReset : 1;
|
||||
unsigned char reserved : 2;
|
||||
#endif
|
||||
}bitfield;
|
||||
}GeneralCompProperties;
|
||||
@ -331,12 +333,6 @@ struct HpmfwupgGetCurrentVersionResp
|
||||
unsigned char currentVersion[HPMFWUPG_VERSION_SIZE];
|
||||
}__attribute__ ((packed));
|
||||
|
||||
struct HpmfwupgGetGroupingIdResp
|
||||
{
|
||||
unsigned char picmgId;
|
||||
unsigned char groupingId;
|
||||
}__attribute__ ((packed));
|
||||
|
||||
struct HpmfwupgGetDescStringResp
|
||||
{
|
||||
unsigned char picmgId;
|
||||
@ -361,7 +357,6 @@ struct HpmfwupgGetComponentPropertiesResp
|
||||
{
|
||||
struct HpmfwupgGetGeneralPropResp generalPropResp;
|
||||
struct HpmfwupgGetCurrentVersionResp currentVersionResp;
|
||||
struct HpmfwupgGetGroupingIdResp groupingIdResp;
|
||||
struct HpmfwupgGetDescStringResp descStringResp;
|
||||
struct HpmfwupgGetRollbackFwVersionResp rollbackFwVersionResp;
|
||||
struct HpmfwupgGetDeferredFwVersionResp deferredFwVersionResp;
|
||||
@ -374,57 +369,56 @@ struct HpmfwupgGetComponentPropertiesCtx
|
||||
struct HpmfwupgGetComponentPropertiesResp resp;
|
||||
}__attribute__ ((packed));
|
||||
|
||||
|
||||
/*
|
||||
* PREPARE COMPONENTS DEFINITIONS
|
||||
* ABORT UPGRADE DEFINITIONS
|
||||
*/
|
||||
|
||||
typedef enum eHpmfwupgUploadMode
|
||||
{
|
||||
HPMFWUPG_UPLOAD_MODE_UPGRADE = 0,
|
||||
HPMFWUPG_UPLOAD_MODE_VALIDATE,
|
||||
HPMFWUPG_UPLOAD_MODE_MAX
|
||||
} tHpmfwupgUploadMode;
|
||||
|
||||
struct HpmfwupgPrepareComponentsReq
|
||||
{
|
||||
unsigned char picmgId;
|
||||
struct HpmfwupgComponentBitMask componentsMask;
|
||||
unsigned char uploadMode;
|
||||
}__attribute__ ((packed));
|
||||
|
||||
struct HpmfwupgPrepareComponentsResp
|
||||
struct HpmfwupgAbortUpgradeReq
|
||||
{
|
||||
unsigned char picmgId;
|
||||
}__attribute__ ((packed));
|
||||
|
||||
struct HpmfwupgPrepareComponentsCtx
|
||||
struct HpmfwupgAbortUpgradeResp
|
||||
{
|
||||
struct HpmfwupgPrepareComponentsReq req;
|
||||
struct HpmfwupgPrepareComponentsResp resp;
|
||||
unsigned char picmgId;
|
||||
}__attribute__ ((packed));
|
||||
|
||||
struct HpmfwupgAbortUpgradeCtx
|
||||
{
|
||||
struct HpmfwupgAbortUpgradeReq req;
|
||||
struct HpmfwupgAbortUpgradeResp resp;
|
||||
}__attribute__ ((packed));
|
||||
|
||||
/*
|
||||
* BACKUP COMPONENTS DEFINITIONS
|
||||
* UPGRADE ACTIONS DEFINITIONS
|
||||
*/
|
||||
typedef enum eHpmfwupgUpgradeAction
|
||||
{
|
||||
HPMFWUPG_UPGRADE_ACTION_BACKUP = 0,
|
||||
HPMFWUPG_UPGRADE_ACTION_PREPARE,
|
||||
HPMFWUPG_UPGRADE_ACTION_UPGRADE,
|
||||
HPMFWUPG_UPGRADE_ACTION_COMPARE,
|
||||
HPMFWUPG_UPGRADE_ACTION_INVALID = 0xff
|
||||
} tHpmfwupgUpgradeAction;
|
||||
|
||||
struct HpmfwupgBackupComponentsReq
|
||||
struct HpmfwupgInitiateUpgradeActionReq
|
||||
{
|
||||
unsigned char picmgId;
|
||||
struct HpmfwupgComponentBitMask componentsMask;
|
||||
unsigned char upgradeAction;
|
||||
}__attribute__ ((packed));
|
||||
|
||||
struct HpmfwupgBackupComponentsResp
|
||||
struct HpmfwupgInitiateUpgradeActionResp
|
||||
{
|
||||
unsigned char picmgId;
|
||||
}__attribute__ ((packed));
|
||||
|
||||
struct HpmfwupgBackupComponentsCtx
|
||||
struct HpmfwupgInitiateUpgradeActionCtx
|
||||
{
|
||||
struct HpmfwupgBackupComponentsReq req;
|
||||
struct HpmfwupgBackupComponentsResp resp;
|
||||
struct HpmfwupgInitiateUpgradeActionReq req;
|
||||
struct HpmfwupgInitiateUpgradeActionResp resp;
|
||||
}__attribute__ ((packed));
|
||||
|
||||
|
||||
/*
|
||||
* UPLOAD FIRMWARE BLOCK DEFINITIONS
|
||||
*/
|
||||
@ -438,7 +432,6 @@ struct HpmfwupgBackupComponentsCtx
|
||||
struct HpmfwupgUploadFirmwareBlockReq
|
||||
{
|
||||
unsigned char picmgId;
|
||||
struct HpmfwupgComponentBitMask componentsMask;
|
||||
unsigned char blockNumber;
|
||||
unsigned char data[HPMFWUPG_SEND_DATA_COUNT_MAX];
|
||||
}__attribute__ ((packed));
|
||||
@ -459,7 +452,7 @@ struct HpmfwupgUploadFirmwareBlockCtx
|
||||
* FINISH FIRMWARE UPLOAD DEFINITIONS
|
||||
*/
|
||||
|
||||
#define HPMFWUPG_IMAGE_SIZE_BYTE_COUNT 3
|
||||
#define HPMFWUPG_IMAGE_SIZE_BYTE_COUNT 4
|
||||
|
||||
struct HpmfwupgFinishFirmwareUploadReq
|
||||
{
|
||||
@ -593,7 +586,7 @@ struct HpmfwupgQuerySelftestResultCtx
|
||||
#define HPMFWUPG_MANUFATURER_ID_LENGTH 3
|
||||
#define HPMFWUPG_PRODUCT_ID_LENGTH 2
|
||||
#define HPMFWUPG_TIME_LENGTH 4
|
||||
#define HPMFWUPG_TIMEOUT_LENGTH 2
|
||||
#define HPMFWUPG_TIMEOUT_LENGTH 1
|
||||
#define HPMFWUPG_COMP_REVISION_LENGTH 2
|
||||
#define HPMFWUPG_FIRM_REVISION_LENGTH 6
|
||||
#define HPMFWUPG_IMAGE_HEADER_VERSION 0
|
||||
@ -613,22 +606,24 @@ struct HpmfwupgImageHeader
|
||||
{
|
||||
#if WORDS_BIGENDIAN
|
||||
unsigned char imageSelfTest : 1;
|
||||
unsigned char imageRollback : 1;
|
||||
unsigned char payloadAffected : 1;
|
||||
unsigned char reserved : 5;
|
||||
unsigned char autRollback : 1;
|
||||
unsigned char manRollback : 1;
|
||||
unsigned char servAffected : 1;
|
||||
unsigned char reserved : 4;
|
||||
#else
|
||||
unsigned char reserved : 5;
|
||||
unsigned char payloadAffected : 1;
|
||||
unsigned char imageRollback : 1;
|
||||
unsigned char reserved : 4;
|
||||
unsigned char servAffected : 1;
|
||||
unsigned char manRollback : 1;
|
||||
unsigned char autRollback : 1;
|
||||
unsigned char imageSelfTest : 1;
|
||||
#endif
|
||||
} bitField;
|
||||
unsigned char byte;
|
||||
}imageCapabilities;
|
||||
struct HpmfwupgComponentBitMask components;
|
||||
unsigned char selfTestTimeout[HPMFWUPG_TIMEOUT_LENGTH];
|
||||
unsigned char rollbackTimeout[HPMFWUPG_TIMEOUT_LENGTH];
|
||||
unsigned char inaccessTimeout[HPMFWUPG_TIMEOUT_LENGTH];
|
||||
unsigned char selfTestTimeout;
|
||||
unsigned char rollbackTimeout;
|
||||
unsigned char inaccessTimeout;
|
||||
unsigned char compRevision[HPMFWUPG_COMP_REVISION_LENGTH];
|
||||
unsigned char firmRevision[HPMFWUPG_FIRM_REVISION_LENGTH];
|
||||
unsigned short oemDataLength;
|
||||
@ -644,7 +639,7 @@ struct HpmfwupgActionRecord
|
||||
unsigned char checksum;
|
||||
}__attribute__ ((packed));
|
||||
|
||||
#define HPMFWUPG_FIRMWARE_SIZE_LENGTH 3
|
||||
#define HPMFWUPG_FIRMWARE_SIZE_LENGTH 4
|
||||
|
||||
struct HpmfwupgFirmwareImage
|
||||
{
|
||||
@ -657,8 +652,9 @@ struct HpmfwupgUpgradeCtx
|
||||
{
|
||||
unsigned int imageSize;
|
||||
unsigned char* pImageData;
|
||||
struct HpmfwupgGetTargetUpgCapabilitiesCtx targetCap;
|
||||
struct HpmfwupgGetComponentPropertiesCtx genCompProp;
|
||||
unsigned char componentId;
|
||||
struct HpmfwupgGetTargetUpgCapabilitiesResp targetCap;
|
||||
struct HpmfwupgGetGeneralPropResp genCompProp[HPMFWUPG_COMPONENT_ID_MAX];
|
||||
struct ipm_devid_rsp devId;
|
||||
}__attribute__ ((packed));
|
||||
|
||||
@ -692,14 +688,11 @@ static int HpmfwupgQuerySelftestResult(struct ipmi_intf *intf,
|
||||
static int HpmfwupgQueryRollbackStatus(struct ipmi_intf *intf,
|
||||
struct HpmfwupgQueryRollbackStatusCtx* pCtx,
|
||||
struct HpmfwupgUpgradeCtx* pFwupgCtx);
|
||||
static int HpmfwupgPrepareComponents(struct ipmi_intf *intf,
|
||||
struct HpmfwupgPrepareComponentsCtx* pCtx,
|
||||
static int HpmfwupgAbortUpgrade(struct ipmi_intf *intf,
|
||||
struct HpmfwupgAbortUpgradeCtx* pCtx);
|
||||
static int HpmfwupgInitiateUpgradeAction(struct ipmi_intf *intf,
|
||||
struct HpmfwupgInitiateUpgradeActionCtx* pCtx,
|
||||
struct HpmfwupgUpgradeCtx* pFwupgCtx);
|
||||
|
||||
static int HpmfwupgBackupComponents(struct ipmi_intf *intf,
|
||||
struct HpmfwupgBackupComponentsCtx* pCtx,
|
||||
struct HpmfwupgUpgradeCtx* pFwupgCtx);
|
||||
|
||||
static int HpmfwupgUploadFirmwareBlock(struct ipmi_intf *intf,
|
||||
struct HpmfwupgUploadFirmwareBlockCtx* pCtx,
|
||||
struct HpmfwupgUpgradeCtx* pFwupgCtx, int count);
|
||||
@ -730,7 +723,7 @@ static struct ipmi_rs * HpmfwupgSendCmd(struct ipmi_intf *intf, struct ipmi_rq
|
||||
*
|
||||
* Description: This function performs the HPM.1 firmware upgrade procedure as
|
||||
* defined the IPM Controller Firmware Upgrade Specification
|
||||
* version 0.9
|
||||
* version 1.0
|
||||
*
|
||||
*****************************************************************************/
|
||||
int HpmfwupgUpgrade(struct ipmi_intf *intf, char* imageFilename, int activate)
|
||||
@ -752,10 +745,12 @@ int HpmfwupgUpgrade(struct ipmi_intf *intf, char* imageFilename, int activate)
|
||||
if ( rc == HPMFWUPG_SUCCESS )
|
||||
{
|
||||
printf("Validating firmware image integrity...");
|
||||
fflush(stdout);
|
||||
rc = HpmfwupgValidateImageIntegrity(&fwupgCtx);
|
||||
if ( rc == HPMFWUPG_SUCCESS )
|
||||
{
|
||||
printf("OK\n");
|
||||
fflush(stdout);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -770,10 +765,12 @@ int HpmfwupgUpgrade(struct ipmi_intf *intf, char* imageFilename, int activate)
|
||||
if ( rc == HPMFWUPG_SUCCESS )
|
||||
{
|
||||
printf("Performing preparation stage...");
|
||||
fflush(stdout);
|
||||
rc = HpmfwupgPreparationStage(intf, &fwupgCtx);
|
||||
if ( rc == HPMFWUPG_SUCCESS )
|
||||
{
|
||||
printf("OK\n");
|
||||
fflush(stdout);
|
||||
/* Print useful information to user */
|
||||
lprintf(LOG_NOTICE," Target Product ID : %u", buf2short(fwupgCtx.devId.product_id));
|
||||
lprintf(LOG_NOTICE," Target Manufacturer ID: %u", buf2short(fwupgCtx.devId.manufacturer_id));
|
||||
@ -830,7 +827,7 @@ int HpmfwupgUpgrade(struct ipmi_intf *intf, char* imageFilename, int activate)
|
||||
*
|
||||
* Description: This function validates a HPM.1 firmware image file as defined
|
||||
* in section 4 of the IPM Controller Firmware Upgrade
|
||||
* Specification version draft 0.9
|
||||
* Specification version 1.0
|
||||
*
|
||||
*****************************************************************************/
|
||||
int HpmfwupgValidateImageIntegrity(struct HpmfwupgUpgradeCtx* pFwupgCtx)
|
||||
@ -896,7 +893,7 @@ int HpmfwupgValidateImageIntegrity(struct HpmfwupgUpgradeCtx* pFwupgCtx)
|
||||
*
|
||||
* Description: This function the preperation stage of a firmware upgrade
|
||||
* procedure as defined in section 3.2 of the IPM Controller
|
||||
* Firmware Upgrade Specification version draft 0.9
|
||||
* Firmware Upgrade Specification version 1.0
|
||||
*
|
||||
*****************************************************************************/
|
||||
int HpmfwupgPreparationStage(struct ipmi_intf *intf, struct HpmfwupgUpgradeCtx* pFwupgCtx)
|
||||
@ -941,37 +938,6 @@ int HpmfwupgPreparationStage(struct ipmi_intf *intf, struct HpmfwupgUpgradeCtx*
|
||||
}
|
||||
}
|
||||
|
||||
/* Get target upgrade capabilities */
|
||||
if ( rc == HPMFWUPG_SUCCESS )
|
||||
{
|
||||
struct HpmfwupgGetTargetUpgCapabilitiesCtx targetCapCmd;
|
||||
|
||||
rc = HpmfwupgGetTargetUpgCapabilities(intf, &pFwupgCtx->targetCap);
|
||||
|
||||
if ( rc == HPMFWUPG_SUCCESS )
|
||||
{
|
||||
/* This upgrade agent uses both IPMB-A and IPMB-B */
|
||||
if ( (pFwupgCtx->targetCap.resp.GlobalCapabilities.bitField.ipmbbAccess == 1 ) &&
|
||||
(pFwupgCtx->targetCap.resp.GlobalCapabilities.bitField.ipmbaAccess == 1 ) )
|
||||
{
|
||||
/* Make sure all component IDs defined in the upgrade
|
||||
image are supported by the IPMC */
|
||||
if ( (pImageHeader->components.ComponentBits.byte &
|
||||
pFwupgCtx->targetCap.resp.componentsPresent.ComponentBits.byte ) !=
|
||||
pImageHeader->components.ComponentBits.byte )
|
||||
{
|
||||
lprintf(LOG_NOTICE,"\n Some components present in the image file are not supported by the IPMC");
|
||||
rc = HPMFWUPG_ERROR;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lprintf(LOG_NOTICE,"\n This Upgrade Agent uses both IPMB-A and IPMB-B. Cannot continue");
|
||||
rc = HPMFWUPG_ERROR;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Validate earliest compatible revision */
|
||||
if ( rc == HPMFWUPG_SUCCESS )
|
||||
{
|
||||
@ -1006,6 +972,88 @@ int HpmfwupgPreparationStage(struct ipmi_intf *intf, struct HpmfwupgUpgradeCtx*
|
||||
}
|
||||
}
|
||||
|
||||
/* Get target upgrade capabilities */
|
||||
if ( rc == HPMFWUPG_SUCCESS )
|
||||
{
|
||||
struct HpmfwupgGetTargetUpgCapabilitiesCtx targetCapCmd;
|
||||
|
||||
rc = HpmfwupgGetTargetUpgCapabilities(intf, &targetCapCmd);
|
||||
|
||||
if ( rc == HPMFWUPG_SUCCESS )
|
||||
{
|
||||
/* Copy response to context */
|
||||
memcpy(&pFwupgCtx->targetCap,
|
||||
&targetCapCmd.resp,
|
||||
sizeof(struct HpmfwupgGetTargetUpgCapabilitiesResp));
|
||||
|
||||
/* Make sure all component IDs defined in the upgrade
|
||||
image are supported by the IPMC */
|
||||
if ( (pImageHeader->components.ComponentBits.byte &
|
||||
pFwupgCtx->targetCap.componentsPresent.ComponentBits.byte ) !=
|
||||
pImageHeader->components.ComponentBits.byte )
|
||||
{
|
||||
lprintf(LOG_NOTICE,"\n Some components present in the image file are not supported by the IPMC");
|
||||
rc = HPMFWUPG_ERROR;
|
||||
}
|
||||
|
||||
/* Make sure the upgrade is desirable rigth now */
|
||||
if ( pFwupgCtx->targetCap.GlobalCapabilities.bitField.fwUpgUndesirable == 1 )
|
||||
{
|
||||
lprintf(LOG_NOTICE,"\n Upgrade undesirable at this moment");
|
||||
rc = HPMFWUPG_ERROR;
|
||||
}
|
||||
|
||||
/* Get confimation from the user if he wants to continue when service
|
||||
affected during upgrade */
|
||||
if ( pFwupgCtx->targetCap.GlobalCapabilities.bitField.servAffectDuringUpg == 1 ||
|
||||
pImageHeader->imageCapabilities.bitField.servAffected == 1 )
|
||||
{
|
||||
char answer;
|
||||
printf("\n Services may be affected during upgrade. Do you wish to continue? y/n ");
|
||||
fflush(stdout);
|
||||
answer = getchar();
|
||||
if ( answer == 'n' )
|
||||
{
|
||||
rc = HPMFWUPG_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/* Get the general properties of each component present in image */
|
||||
if ( rc == HPMFWUPG_SUCCESS )
|
||||
{
|
||||
int componentId;
|
||||
|
||||
for ( componentId = HPMFWUPG_COMPONENT_ID_0;
|
||||
componentId < HPMFWUPG_COMPONENT_ID_MAX;
|
||||
componentId++ )
|
||||
{
|
||||
/* Reset component properties */
|
||||
memset(&pFwupgCtx->genCompProp[0], 0, sizeof (struct HpmfwupgGetGeneralPropResp));
|
||||
|
||||
if ( (1 << componentId & pImageHeader->components.ComponentBits.byte) )
|
||||
{
|
||||
struct HpmfwupgGetComponentPropertiesCtx getCompPropCmd;
|
||||
|
||||
/* Get general component properties */
|
||||
getCompPropCmd.req.componentId = componentId;
|
||||
getCompPropCmd.req.selector = HPMFWUPG_COMP_GEN_PROPERTIES;
|
||||
|
||||
rc = HpmfwupgGetComponentProperties(intf, &getCompPropCmd);
|
||||
|
||||
if ( rc == HPMFWUPG_SUCCESS )
|
||||
{
|
||||
/* Copy response to context */
|
||||
memcpy(&pFwupgCtx->genCompProp[componentId],
|
||||
&getCompPropCmd.resp,
|
||||
sizeof(struct HpmfwupgGetGeneralPropResp));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -1015,7 +1063,7 @@ int HpmfwupgPreparationStage(struct ipmi_intf *intf, struct HpmfwupgUpgradeCtx*
|
||||
*
|
||||
* Description: This function the upgrade stage of a firmware upgrade
|
||||
* procedure as defined in section 3.3 of the IPM Controller
|
||||
* Firmware Upgrade Specification version draft 0.9
|
||||
* Firmware Upgrade Specification version 1.0
|
||||
*
|
||||
*****************************************************************************/
|
||||
int HpmfwupgUpgradeStage(struct ipmi_intf *intf, struct HpmfwupgUpgradeCtx* pFwupgCtx)
|
||||
@ -1027,7 +1075,7 @@ int HpmfwupgUpgradeStage(struct ipmi_intf *intf, struct HpmfwupgUpgradeCtx* pFwu
|
||||
struct HpmfwupgImageHeader* pImageHeader = (struct HpmfwupgImageHeader*)
|
||||
pFwupgCtx->pImageData;
|
||||
|
||||
/* Place pointer after image header */
|
||||
/* Put pointer after image header */
|
||||
pImagePtr = (unsigned char*)
|
||||
(pFwupgCtx->pImageData + sizeof(struct HpmfwupgImageHeader) +
|
||||
pImageHeader->oemDataLength + sizeof(unsigned char)/*checksum*/);
|
||||
@ -1055,13 +1103,23 @@ int HpmfwupgUpgradeStage(struct ipmi_intf *intf, struct HpmfwupgUpgradeCtx* pFwu
|
||||
{
|
||||
switch( pActionRecord->actionType )
|
||||
{
|
||||
int componentId;
|
||||
case HPMFWUPG_ACTION_BACKUP_COMPONENTS:
|
||||
lprintf(LOG_NOTICE," Backup component not supported by this Upgrade Agent");
|
||||
rc = HPMFWUPG_ERROR;
|
||||
{
|
||||
/* Send prepare components command */
|
||||
struct HpmfwupgInitiateUpgradeActionCtx initUpgActionCmd;
|
||||
|
||||
initUpgActionCmd.req.componentsMask = pActionRecord->components;
|
||||
/* Action is prepare components */
|
||||
initUpgActionCmd.req.upgradeAction = HPMFWUPG_UPGRADE_ACTION_BACKUP;
|
||||
rc = HpmfwupgInitiateUpgradeAction(intf, &initUpgActionCmd, pFwupgCtx);
|
||||
pImagePtr += sizeof(struct HpmfwupgActionRecord);
|
||||
|
||||
}
|
||||
break;
|
||||
case HPMFWUPG_ACTION_PREPARE_COMPONENTS:
|
||||
/* Make sure every the components specified by this action
|
||||
{
|
||||
int componentId;
|
||||
/* Make sure every components specified by this action
|
||||
supports the prepare components */
|
||||
for ( componentId = HPMFWUPG_COMPONENT_ID_0;
|
||||
componentId < HPMFWUPG_COMPONENT_ID_MAX;
|
||||
@ -1069,14 +1127,7 @@ int HpmfwupgUpgradeStage(struct ipmi_intf *intf, struct HpmfwupgUpgradeCtx* pFwu
|
||||
{
|
||||
if ( (1 << componentId & pActionRecord->components.ComponentBits.byte) )
|
||||
{
|
||||
/* Get general component properties */
|
||||
pFwupgCtx->genCompProp.req.componentId = componentId;
|
||||
pFwupgCtx->genCompProp.req.selector = HPMFWUPG_COMP_GEN_PROPERTIES;
|
||||
rc = HpmfwupgGetComponentProperties(intf, &pFwupgCtx->genCompProp);
|
||||
if ( rc == HPMFWUPG_SUCCESS )
|
||||
{
|
||||
if ( pFwupgCtx->genCompProp.resp.Response.generalPropResp.GeneralCompProperties.
|
||||
bitfield.preparationSupport == 0 )
|
||||
if ( pFwupgCtx->genCompProp[componentId].GeneralCompProperties.bitfield.preparationSupport == 0 )
|
||||
{
|
||||
lprintf(LOG_NOTICE," Prepare component not supported by component ID %d", componentId);
|
||||
rc = HPMFWUPG_ERROR;
|
||||
@ -1084,24 +1135,25 @@ int HpmfwupgUpgradeStage(struct ipmi_intf *intf, struct HpmfwupgUpgradeCtx* pFwu
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( rc == HPMFWUPG_SUCCESS )
|
||||
{
|
||||
/* Send prepare components command */
|
||||
struct HpmfwupgPrepareComponentsCtx prepCompCmd;
|
||||
struct HpmfwupgInitiateUpgradeActionCtx initUpgActionCmd;
|
||||
|
||||
prepCompCmd.req.componentsMask = pActionRecord->components;
|
||||
/* Only upgrade mode supported */
|
||||
prepCompCmd.req.uploadMode = HPMFWUPG_UPLOAD_MODE_UPGRADE;
|
||||
rc = HpmfwupgPrepareComponents(intf, &prepCompCmd, pFwupgCtx);
|
||||
initUpgActionCmd.req.componentsMask = pActionRecord->components;
|
||||
/* Action is prepare components */
|
||||
initUpgActionCmd.req.upgradeAction = HPMFWUPG_UPGRADE_ACTION_PREPARE;
|
||||
rc = HpmfwupgInitiateUpgradeAction(intf, &initUpgActionCmd, pFwupgCtx);
|
||||
pImagePtr += sizeof(struct HpmfwupgActionRecord);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case HPMFWUPG_ACTION_UPLOAD_FIRMWARE:
|
||||
/* Upload all firmware blocks */
|
||||
{
|
||||
struct HpmfwupgFirmwareImage* pFwImage;
|
||||
struct HpmfwupgInitiateUpgradeActionCtx initUpgActionCmd;
|
||||
struct HpmfwupgUploadFirmwareBlockCtx uploadCmd;
|
||||
struct HpmfwupgFinishFirmwareUploadCtx finishCmd;
|
||||
unsigned char* pData, *pDataInitial;
|
||||
@ -1110,8 +1162,19 @@ int HpmfwupgUpgradeStage(struct ipmi_intf *intf, struct HpmfwupgUpgradeCtx* pFwu
|
||||
unsigned char bufLength = 0;
|
||||
unsigned int firmwareLength = 0;
|
||||
|
||||
/* Send initiate command */
|
||||
initUpgActionCmd.req.componentsMask = pActionRecord->components;
|
||||
|
||||
/* Action is upgrade */
|
||||
initUpgActionCmd.req.upgradeAction = HPMFWUPG_UPGRADE_ACTION_UPGRADE;
|
||||
rc = HpmfwupgInitiateUpgradeAction(intf, &initUpgActionCmd, pFwupgCtx);
|
||||
|
||||
if ( rc == HPMFWUPG_SUCCESS )
|
||||
{
|
||||
/* Save component ID on which the upload is done */
|
||||
pFwupgCtx->componentId = (1 << pActionRecord->components.ComponentBits.byte);
|
||||
|
||||
/* Initialize parameters */
|
||||
uploadCmd.req.componentsMask = pActionRecord->components;
|
||||
uploadCmd.req.blockNumber = 0;
|
||||
pFwImage = (struct HpmfwupgFirmwareImage*)(pImagePtr +
|
||||
sizeof(struct HpmfwupgActionRecord));
|
||||
@ -1164,6 +1227,7 @@ int HpmfwupgUpgradeStage(struct ipmi_intf *intf, struct HpmfwupgUpgradeCtx* pFwu
|
||||
firmwareLength = pFwImage->length[0];
|
||||
firmwareLength |= (pFwImage->length[1] << 8) & 0xff00;
|
||||
firmwareLength |= (pFwImage->length[2] << 16) & 0xff0000;
|
||||
firmwareLength |= (pFwImage->length[3] << 24) & 0xff000000;
|
||||
|
||||
while ( (pData < (pDataInitial + firmwareLength)) &&
|
||||
(rc == HPMFWUPG_SUCCESS) )
|
||||
@ -1179,6 +1243,7 @@ int HpmfwupgUpgradeStage(struct ipmi_intf *intf, struct HpmfwupgUpgradeCtx* pFwu
|
||||
}
|
||||
totalSent += count;
|
||||
memcpy(&uploadCmd.req.data, pData, bufLength);
|
||||
|
||||
rc = HpmfwupgUploadFirmwareBlock(intf, &uploadCmd, pFwupgCtx, count);
|
||||
|
||||
if ( rc == HPMFWUPG_SUCCESS )
|
||||
@ -1211,10 +1276,12 @@ int HpmfwupgUpgradeStage(struct ipmi_intf *intf, struct HpmfwupgUpgradeCtx* pFwu
|
||||
finishCmd.req.imageLength[0] = pFwImage->length[0];
|
||||
finishCmd.req.imageLength[1] = pFwImage->length[1];
|
||||
finishCmd.req.imageLength[2] = pFwImage->length[2];
|
||||
finishCmd.req.imageLength[3] = pFwImage->length[3];
|
||||
rc = HpmfwupgFinishFirmwareUpload(intf, &finishCmd, pFwupgCtx);
|
||||
pImagePtr = pDataInitial + firmwareLength;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
lprintf(LOG_NOTICE," Invalid Action type. Cannot continue");
|
||||
@ -1232,7 +1299,7 @@ int HpmfwupgUpgradeStage(struct ipmi_intf *intf, struct HpmfwupgUpgradeCtx* pFwu
|
||||
*
|
||||
* Description: This function the validation stage of a firmware upgrade
|
||||
* procedure as defined in section 3.4 of the IPM Controller
|
||||
* Firmware Upgrade Specification version draft 0.9
|
||||
* Firmware Upgrade Specification version 1.0
|
||||
*
|
||||
*****************************************************************************/
|
||||
static int HpmfwupgActivationStage(struct ipmi_intf *intf, struct HpmfwupgUpgradeCtx* pFwupgCtx)
|
||||
@ -1244,13 +1311,14 @@ static int HpmfwupgActivationStage(struct ipmi_intf *intf, struct HpmfwupgUpgrad
|
||||
|
||||
/* Print out stuf...*/
|
||||
printf(" ");
|
||||
fflush(stdout);
|
||||
/* Activate new firmware */
|
||||
rc = HpmfwupgActivateFirmware(intf, &activateCmd, pFwupgCtx);
|
||||
|
||||
if ( rc == HPMFWUPG_SUCCESS )
|
||||
{
|
||||
/* Query self test result if supported by target and new image */
|
||||
if ( (pFwupgCtx->targetCap.resp.GlobalCapabilities.bitField.ipmcSelftest == 1) &&
|
||||
if ( (pFwupgCtx->targetCap.GlobalCapabilities.bitField.ipmcSelftestCap == 1) ||
|
||||
(pImageHeader->imageCapabilities.bitField.imageSelfTest == 1) )
|
||||
{
|
||||
struct HpmfwupgQuerySelftestResultCtx selfTestCmd;
|
||||
@ -1281,9 +1349,8 @@ static int HpmfwupgActivationStage(struct ipmi_intf *intf, struct HpmfwupgUpgrad
|
||||
/* If activation / self test failed, query rollback status if automatic rollback supported */
|
||||
if ( rc == HPMFWUPG_ERROR )
|
||||
{
|
||||
if ( (pFwupgCtx->targetCap.resp.GlobalCapabilities.bitField.ipmcRollback == 1) &&
|
||||
(pFwupgCtx->genCompProp.resp.Response.generalPropResp.GeneralCompProperties.
|
||||
bitfield.rollbackBackup == 0x02) )
|
||||
if ( (pFwupgCtx->targetCap.GlobalCapabilities.bitField.autRollback == 1) &&
|
||||
(pFwupgCtx->genCompProp[pFwupgCtx->componentId].GeneralCompProperties.bitfield.rollbackBackup != 0x00) )
|
||||
{
|
||||
struct HpmfwupgQueryRollbackStatusCtx rollCmd;
|
||||
lprintf(LOG_NOTICE," Getting rollback status...");
|
||||
@ -1387,6 +1454,7 @@ int HpmfwupgGetTargetUpgCapabilities(struct ipmi_intf *intf,
|
||||
{
|
||||
lprintf(LOG_NOTICE,"TARGET UPGRADE CAPABILITIES");
|
||||
lprintf(LOG_NOTICE,"-------------------------------");
|
||||
lprintf(LOG_NOTICE,"HPM.1 version............%d ", pCtx->resp.hpmVersion);
|
||||
lprintf(LOG_NOTICE,"Component 0 presence....[%c] ", pCtx->resp.componentsPresent.ComponentBits.
|
||||
bitField.component0 ? 'y' : 'n');
|
||||
lprintf(LOG_NOTICE,"Component 1 presence....[%c] ", pCtx->resp.componentsPresent.ComponentBits.
|
||||
@ -1403,20 +1471,22 @@ int HpmfwupgGetTargetUpgCapabilities(struct ipmi_intf *intf,
|
||||
bitField.component6 ? 'y' : 'n');
|
||||
lprintf(LOG_NOTICE,"Component 7 presence....[%c] ", pCtx->resp.componentsPresent.ComponentBits.
|
||||
bitField.component7 ? 'y' : 'n');
|
||||
lprintf(LOG_NOTICE,"Payload affected........[%c] ", pCtx->resp.GlobalCapabilities.
|
||||
bitField.payloadAffected ? 'y' : 'n');
|
||||
lprintf(LOG_NOTICE,"Upgrade undesirable.....[%c] ", pCtx->resp.GlobalCapabilities.
|
||||
bitField.fwUpgUndesirable ? 'y' : 'n');
|
||||
lprintf(LOG_NOTICE,"Aut rollback override...[%c] ", pCtx->resp.GlobalCapabilities.
|
||||
bitField.autRollbackOverride ? 'y' : 'n');
|
||||
lprintf(LOG_NOTICE,"IPMC degraded...........[%c] ", pCtx->resp.GlobalCapabilities.
|
||||
bitField.ipmcDegradedDurinUpg ? 'y' : 'n');
|
||||
lprintf(LOG_NOTICE,"Defered activation......[%c] ", pCtx->resp.GlobalCapabilities.
|
||||
bitField.deferActivation ? 'y' : 'n');
|
||||
lprintf(LOG_NOTICE,"Service affected........[%c] ", pCtx->resp.GlobalCapabilities.
|
||||
bitField.servAffectDuringUpg ? 'y' : 'n');
|
||||
lprintf(LOG_NOTICE,"Manual rollback.........[%c] ", pCtx->resp.GlobalCapabilities.
|
||||
bitField.manualRollback ? 'y' : 'n');
|
||||
lprintf(LOG_NOTICE,"Defered activation......[%c] ", pCtx->resp.GlobalCapabilities.
|
||||
bitField.ipmcDeferActivation ? 'y' : 'n');
|
||||
lprintf(LOG_NOTICE,"Automatic rollback......[%c] ", pCtx->resp.GlobalCapabilities.
|
||||
bitField.ipmcRollback ? 'y' : 'n');
|
||||
bitField.autRollback ? 'y' : 'n');
|
||||
lprintf(LOG_NOTICE,"Self test...............[%c] ", pCtx->resp.GlobalCapabilities.
|
||||
bitField.ipmcSelftest ? 'y' : 'n');
|
||||
lprintf(LOG_NOTICE,"IPMB-B access...........[%c] ", pCtx->resp.GlobalCapabilities.
|
||||
bitField.ipmbbAccess ? 'y' : 'n');
|
||||
lprintf(LOG_NOTICE,"IPMB-A access...........[%c] ", pCtx->resp.GlobalCapabilities.
|
||||
bitField.ipmbaAccess ? 'y' : 'n');
|
||||
bitField.ipmcSelftestCap ? 'y' : 'n');
|
||||
lprintf(LOG_NOTICE,"Upgrade timeout.........[%d sec] ", pCtx->resp.upgradeTimeout*5);
|
||||
lprintf(LOG_NOTICE,"Self test timeout.......[%d sec] ", pCtx->resp.selftestTimeout*5);
|
||||
lprintf(LOG_NOTICE,"Rollback timeout........[%d sec] ", pCtx->resp.rollbackTimeout*5);
|
||||
@ -1469,20 +1539,16 @@ int HpmfwupgGetComponentProperties(struct ipmi_intf *intf, struct HpmfwupgGetCom
|
||||
{
|
||||
lprintf(LOG_NOTICE,"GENERAL PROPERTIES");
|
||||
lprintf(LOG_NOTICE,"-------------------------------");
|
||||
lprintf(LOG_NOTICE,"IPMB-A accessibility......[%c] ", pCtx->resp.Response.generalPropResp.
|
||||
GeneralCompProperties.bitfield.ipmbaAccess ? 'y' : 'n');
|
||||
lprintf(LOG_NOTICE,"IPMB-B accessibility......[%c] ", pCtx->resp.Response.generalPropResp.
|
||||
GeneralCompProperties.bitfield.ipmbbAccess ? 'y' : 'n');
|
||||
lprintf(LOG_NOTICE,"Rollback supported........[%c] ", pCtx->resp.Response.generalPropResp.
|
||||
GeneralCompProperties.bitfield.rollbackBackup ? 'y' : 'n');
|
||||
lprintf(LOG_NOTICE,"Preparation supported.....[%c] ", pCtx->resp.Response.generalPropResp.
|
||||
GeneralCompProperties.bitfield.preparationSupport ? 'y' : 'n');
|
||||
lprintf(LOG_NOTICE,"Validation supported......[%c] ", pCtx->resp.Response.generalPropResp.
|
||||
GeneralCompProperties.bitfield.validationSupport ? 'y' : 'n');
|
||||
lprintf(LOG_NOTICE,"Payload cold reset req....[%c] ", pCtx->resp.Response.generalPropResp.
|
||||
GeneralCompProperties.bitfield.payloadColdReset ? 'y' : 'n');
|
||||
lprintf(LOG_NOTICE,"Def. activation supported.[%c] ", pCtx->resp.Response.generalPropResp.
|
||||
GeneralCompProperties.bitfield.deferredActivation ? 'y' : 'n');
|
||||
lprintf(LOG_NOTICE,"Payload cold reset req....[%c] \n", pCtx->resp.Response.generalPropResp.
|
||||
GeneralCompProperties.bitfield.payloadColdReset ? 'y' : 'n');
|
||||
lprintf(LOG_NOTICE,"Comparison supported......[%c] ", pCtx->resp.Response.generalPropResp.
|
||||
GeneralCompProperties.bitfield.comparisonSupport ? 'y' : 'n');
|
||||
lprintf(LOG_NOTICE,"Preparation supported.....[%c] ", pCtx->resp.Response.generalPropResp.
|
||||
GeneralCompProperties.bitfield.preparationSupport ? 'y' : 'n');
|
||||
lprintf(LOG_NOTICE,"Rollback supported........[%c] \n", pCtx->resp.Response.generalPropResp.
|
||||
GeneralCompProperties.bitfield.rollbackBackup ? 'y' : 'n');
|
||||
}
|
||||
break;
|
||||
case HPMFWUPG_COMP_CURRENT_VERSION:
|
||||
@ -1498,18 +1564,12 @@ int HpmfwupgGetComponentProperties(struct ipmi_intf *intf, struct HpmfwupgGetCom
|
||||
pCtx->resp.Response.currentVersionResp.currentVersion[5]);
|
||||
}
|
||||
break;
|
||||
case HPMFWUPG_COMP_GROUPING_ID:
|
||||
memcpy(&pCtx->resp, rsp->data, sizeof(struct HpmfwupgGetGroupingIdResp));
|
||||
if ( verbose )
|
||||
{
|
||||
lprintf(LOG_NOTICE,"Grouping ID: %x\n", pCtx->resp.Response.groupingIdResp.groupingId);
|
||||
}
|
||||
break;
|
||||
case HPMFWUPG_COMP_DESCRIPTION_STRING:
|
||||
memcpy(&pCtx->resp, rsp->data, sizeof(struct HpmfwupgGetDescStringResp));
|
||||
|
||||
lprintf(LOG_DEBUG,"Description string: %s\n", pCtx->resp.Response.descStringResp.descString);
|
||||
|
||||
if ( verbose )
|
||||
{
|
||||
lprintf(LOG_NOTICE,"Description string: %s\n", pCtx->resp.Response.descStringResp.descString);
|
||||
}
|
||||
break;
|
||||
case HPMFWUPG_COMP_ROLLBACK_FIRMWARE_VERSION:
|
||||
memcpy(&pCtx->resp, rsp->data, sizeof(struct HpmfwupgGetRollbackFwVersionResp));
|
||||
@ -1559,8 +1619,7 @@ int HpmfwupgGetComponentProperties(struct ipmi_intf *intf, struct HpmfwupgGetCom
|
||||
return rc;
|
||||
}
|
||||
|
||||
int HpmfwupgPrepareComponents(struct ipmi_intf *intf, struct HpmfwupgPrepareComponentsCtx* pCtx,
|
||||
struct HpmfwupgUpgradeCtx* pFwupgCtx)
|
||||
int HpmfwupgAbortUpgrade(struct ipmi_intf *intf, struct HpmfwupgAbortUpgradeCtx* pCtx)
|
||||
{
|
||||
int rc = HPMFWUPG_SUCCESS;
|
||||
struct ipmi_rs * rsp;
|
||||
@ -1570,35 +1629,29 @@ int HpmfwupgPrepareComponents(struct ipmi_intf *intf, struct HpmfwupgPrepareComp
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
req.msg.netfn = IPMI_NETFN_PICMG;
|
||||
req.msg.cmd = HPMFWUPG_PREPARE_COMPONENTS;
|
||||
req.msg.cmd = HPMFWUPG_ABORT_UPGRADE;
|
||||
req.msg.data = (unsigned char*)&pCtx->req;
|
||||
req.msg.data_len = sizeof(struct HpmfwupgPrepareComponentsReq);
|
||||
req.msg.data_len = sizeof(struct HpmfwupgAbortUpgradeReq);
|
||||
|
||||
rsp = HpmfwupgSendCmd(intf, req, pFwupgCtx);
|
||||
rsp = HpmfwupgSendCmd(intf, req, NULL);
|
||||
|
||||
if ( rsp )
|
||||
{
|
||||
/* Long duration command handling */
|
||||
if ( rsp->ccode == HPMFWUPG_COMMAND_IN_PROGRESS )
|
||||
if ( rsp->ccode != 0x00 )
|
||||
{
|
||||
rc = HpmfwupgWaitLongDurationCmd(intf, pFwupgCtx);
|
||||
}
|
||||
else if ( rsp->ccode != 0x00 )
|
||||
{
|
||||
lprintf(LOG_NOTICE,"Error preparing components, compcode = %x\n", rsp->ccode);
|
||||
lprintf(LOG_NOTICE,"Error aborting upgrade, compcode = %x\n", rsp->ccode);
|
||||
rc = HPMFWUPG_ERROR;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lprintf(LOG_NOTICE,"Error preparing components\n");
|
||||
lprintf(LOG_NOTICE,"Error aborting upgrade\n");
|
||||
rc = HPMFWUPG_ERROR;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
int HpmfwupgBackupComponents(struct ipmi_intf *intf, struct HpmfwupgBackupComponentsCtx* pCtx,
|
||||
int HpmfwupgInitiateUpgradeAction(struct ipmi_intf *intf, struct HpmfwupgInitiateUpgradeActionCtx* pCtx,
|
||||
struct HpmfwupgUpgradeCtx* pFwupgCtx)
|
||||
{
|
||||
int rc = HPMFWUPG_SUCCESS;
|
||||
@ -1609,9 +1662,9 @@ int HpmfwupgBackupComponents(struct ipmi_intf *intf, struct HpmfwupgBackupCompon
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
req.msg.netfn = IPMI_NETFN_PICMG;
|
||||
req.msg.cmd = HPMFWUPG_BACKUP_COMPONENTS;
|
||||
req.msg.cmd = HPMFWUPG_INITIATE_UPGRADE_ACTION;
|
||||
req.msg.data = (unsigned char*)&pCtx->req;
|
||||
req.msg.data_len = sizeof(struct HpmfwupgBackupComponentsReq);
|
||||
req.msg.data_len = sizeof(struct HpmfwupgInitiateUpgradeActionReq);
|
||||
|
||||
rsp = HpmfwupgSendCmd(intf, req, pFwupgCtx);
|
||||
|
||||
@ -1624,15 +1677,16 @@ int HpmfwupgBackupComponents(struct ipmi_intf *intf, struct HpmfwupgBackupCompon
|
||||
}
|
||||
else if ( rsp->ccode != 0x00 )
|
||||
{
|
||||
lprintf(LOG_NOTICE,"Error backuping components, compcode = %x\n", rsp->ccode);
|
||||
lprintf(LOG_NOTICE,"Error initiating upgrade action, compcode = %x\n", rsp->ccode);
|
||||
rc = HPMFWUPG_ERROR;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lprintf(LOG_NOTICE,"Error backuping component\n");
|
||||
lprintf(LOG_NOTICE,"Error initiating upgrade action\n");
|
||||
rc = HPMFWUPG_ERROR;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -1649,7 +1703,8 @@ int HpmfwupgUploadFirmwareBlock(struct ipmi_intf *intf, struct HpmfwupgUploadFir
|
||||
req.msg.netfn = IPMI_NETFN_PICMG;
|
||||
req.msg.cmd = HPMFWUPG_UPLOAD_FIRMWARE_BLOCK;
|
||||
req.msg.data = (unsigned char*)&pCtx->req;
|
||||
req.msg.data_len = 3 + count;
|
||||
/* 2 is the size of the upload struct - data */
|
||||
req.msg.data_len = 2 + count;
|
||||
|
||||
rsp = HpmfwupgSendCmd(intf, req, pFwupgCtx);
|
||||
|
||||
@ -1915,7 +1970,7 @@ int HpmfwupgQueryRollbackStatus(struct ipmi_intf *intf, struct HpmfwupgQueryRoll
|
||||
*/
|
||||
if ( pFwupgCtx != NULL )
|
||||
{
|
||||
rollbackTimeout = pFwupgCtx->targetCap.resp.rollbackTimeout*5;
|
||||
rollbackTimeout = pFwupgCtx->targetCap.rollbackTimeout*5;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -2005,8 +2060,7 @@ int HpmfwupgQuerySelftestResult(struct ipmi_intf *intf, struct HpmfwupgQuerySelf
|
||||
/* Getting selftest timeout from new image */
|
||||
struct HpmfwupgImageHeader* pImageHeader = (struct HpmfwupgImageHeader*)
|
||||
pFwupgCtx->pImageData;
|
||||
selfTestTimeout = pImageHeader->selfTestTimeout[0];
|
||||
selfTestTimeout |= pImageHeader->selfTestTimeout[1] << 8;
|
||||
selfTestTimeout = pImageHeader->selfTestTimeout;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -2088,8 +2142,8 @@ struct ipmi_rs * HpmfwupgSendCmd(struct ipmi_intf *intf, struct ipmi_rq req,
|
||||
*/
|
||||
if ( pFwupgCtx != NULL )
|
||||
{
|
||||
inaccessTimeout = pFwupgCtx->targetCap.resp.inaccessTimeout*5;
|
||||
upgradeTimeout = pFwupgCtx->targetCap.resp.upgradeTimeout*5;
|
||||
inaccessTimeout = pFwupgCtx->targetCap.inaccessTimeout*5;
|
||||
upgradeTimeout = pFwupgCtx->targetCap.upgradeTimeout*5;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -2244,7 +2298,7 @@ int HpmfwupgWaitLongDurationCmd(struct ipmi_intf *intf, struct HpmfwupgUpgradeCt
|
||||
*/
|
||||
if ( pFwupgCtx != NULL )
|
||||
{
|
||||
upgradeTimeout = pFwupgCtx->targetCap.resp.upgradeTimeout*5;
|
||||
upgradeTimeout = pFwupgCtx->targetCap.upgradeTimeout*5;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -2309,6 +2363,7 @@ static void HpmfwupgPrintUsage(void)
|
||||
lprintf(LOG_NOTICE," 3- Description string");
|
||||
lprintf(LOG_NOTICE," 4- Rollback firmware version");
|
||||
lprintf(LOG_NOTICE," 5- Deferred firmware version");
|
||||
lprintf(LOG_NOTICE,"abort - Abort the on-going firmware upgrade");
|
||||
lprintf(LOG_NOTICE,"upgstatus - Returns the status of the last long duration command");
|
||||
lprintf(LOG_NOTICE,"rollback - Performs a manual rollback on the IPM Controller");
|
||||
lprintf(LOG_NOTICE," firmware");
|
||||
@ -2364,6 +2419,12 @@ int ipmi_hpmfwupg_main(struct ipmi_intf * intf, int argc, char ** argv)
|
||||
verbose++;
|
||||
rc = HpmfwupgGetComponentProperties(intf, &cmdCtx);
|
||||
}
|
||||
else if ( (argc == 1) && (strcmp(argv[0], "abort") == 0) )
|
||||
{
|
||||
struct HpmfwupgAbortUpgradeCtx cmdCtx;
|
||||
verbose++;
|
||||
rc = HpmfwupgAbortUpgrade(intf, &cmdCtx);
|
||||
}
|
||||
else if ( (argc == 1) && (strcmp(argv[0], "upgstatus") == 0) )
|
||||
{
|
||||
struct HpmfwupgGetUpgradeStatusCtx cmdCtx;
|
||||
|
Loading…
x
Reference in New Issue
Block a user