diff --git a/ipmitool/lib/ipmi_hpmfwupg.c b/ipmitool/lib/ipmi_hpmfwupg.c index d48d239..3b530b5 100644 --- a/ipmitool/lib/ipmi_hpmfwupg.c +++ b/ipmitool/lib/ipmi_hpmfwupg.c @@ -80,6 +80,14 @@ * * see: ipmi-fix-send-msg-retry.pacth in openipmi-developer mailing list * +* 2007-01-16 +* +* - Incremented to version 0.4 +* - Fixed lan iface inaccesiblity timeout handling. Waiting for firmware +* activation completion (fixed sleep) before re-opening a session and +* get the final firmware upgrade status. +* - Fixed some user interface stuff. +* * TODO * =========================================================================== * 2007-01-11 @@ -95,7 +103,7 @@ extern int verbose; * Agent version */ #define HPMFWUPG_VERSION_MAJOR 0 -#define HPMFWUPG_VERSION_MINOR 3 +#define HPMFWUPG_VERSION_MINOR 4 /* * HPM.1 FIRMWARE UPGRADE COMMANDS (part of PICMG) @@ -696,15 +704,15 @@ int HpmfwupgUpgrade(struct ipmi_intf *intf, char* imageFilename, int activate) /* * VALIDATE IMAGE INTEGRITY - */ - + */ + if ( rc == HPMFWUPG_SUCCESS ) { - lprintf(LOG_NOTICE,"Validating firmware image integrity..."); + printf("Validating firmware image integrity..."); rc = HpmfwupgValidateImageIntegrity(&fwupgCtx); if ( rc == HPMFWUPG_SUCCESS ) { - lprintf(LOG_NOTICE,"OK"); + printf("OK\n"); } else { @@ -718,11 +726,11 @@ int HpmfwupgUpgrade(struct ipmi_intf *intf, char* imageFilename, int activate) if ( rc == HPMFWUPG_SUCCESS ) { - lprintf(LOG_NOTICE,"Performing preparation stage..."); + printf("Performing preparation stage..."); rc = HpmfwupgPreparationStage(intf, &fwupgCtx); if ( rc == HPMFWUPG_SUCCESS ) { - lprintf(LOG_NOTICE,"OK"); + printf("OK\n"); /* 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)); @@ -1192,7 +1200,7 @@ static int HpmfwupgActivationStage(struct ipmi_intf *intf, struct HpmfwupgUpgrad pFwupgCtx->pImageData; /* Print out stuf...*/ - lprintf(LOG_NOTICE," "); + printf(" "); /* Activate new firmware */ rc = HpmfwupgActivateFirmware(intf, &activateCmd, pFwupgCtx); @@ -1689,7 +1697,7 @@ int HpmfwupgFinishFirmwareUpload(struct ipmi_intf *intf, struct HpmfwupgFinishFi } int HpmfwupgActivateFirmware(struct ipmi_intf *intf, struct HpmfwupgActivateFirmwareCtx* pCtx, - struct HpmfwupgUpgradeCtx* pFwupgCtx) + struct HpmfwupgUpgradeCtx* pFwupgCtx) { int rc = HPMFWUPG_SUCCESS; struct ipmi_rs * rsp; @@ -1710,9 +1718,11 @@ int HpmfwupgActivateFirmware(struct ipmi_intf *intf, struct HpmfwupgActivateFirm /* Long duration command handling */ if ( rsp->ccode == HPMFWUPG_COMMAND_IN_PROGRESS ) { - lprintf(LOG_NOTICE,"Waiting firmware activation..."); + printf("Waiting firmware activation..."); fflush(stdout); + rc = HpmfwupgWaitLongDurationCmd(intf, pFwupgCtx); + if ( rc == HPMFWUPG_SUCCESS ) { lprintf(LOG_NOTICE,"OK"); @@ -1822,7 +1832,7 @@ int HpmfwupgManualFirmwareRollback(struct ipmi_intf *intf, struct HpmfwupgManual if ( rsp->ccode == HPMFWUPG_COMMAND_IN_PROGRESS ) { struct HpmfwupgQueryRollbackStatusCtx resCmd; - lprintf(LOG_NOTICE,"Waiting firmware rollback..."); + printf("Waiting firmware rollback..."); fflush(stdout); rc = HpmfwupgQueryRollbackStatus(intf, &resCmd, pFwupgCtx); } @@ -2056,6 +2066,7 @@ struct ipmi_rs * HpmfwupgSendCmd(struct ipmi_intf *intf, struct ipmi_rq req, if(strstr(intf->name,"lan")!= NULL) /* also covers lanplus */ { static int errorCount=0; + static struct ipmi_rs fakeRsp; lprintf(LOG_DEBUG,"HPM: no response available"); lprintf(LOG_DEBUG,"HPM: the command may be rejected for " \ @@ -2069,8 +2080,6 @@ struct ipmi_rs * HpmfwupgSendCmd(struct ipmi_intf *intf, struct ipmi_rq req, errorCount < HPM_LAN_PACKET_RESIZE_LIMIT ) { - static struct ipmi_rs fakeRsp; - lprintf(LOG_DEBUG,"HPM: upload firmware block API called"); lprintf(LOG_DEBUG,"HPM: returning length error to force resize"); @@ -2078,6 +2087,54 @@ struct ipmi_rs * HpmfwupgSendCmd(struct ipmi_intf *intf, struct ipmi_rq req, rsp = &fakeRsp; errorCount++; } + else if + ( + req.msg.netfn == IPMI_NETFN_PICMG + && + ( req.msg.cmd == HPMFWUPG_ACTIVATE_FIRMWARE || + req.msg.cmd == HPMFWUPG_MANUAL_FIRMWARE_ROLLBACK ) + + ) + { + /* + * rsp == NULL and command activate firmware or manual firmware + * rollback most likely occurs when we have sent a firmware activation + * request. Fake a command in progress response. + */ + lprintf(LOG_DEBUG,"HPM: activate/rollback firmware API called"); + lprintf(LOG_DEBUG,"HPM: returning in progress to handle IOL session lost"); + + fakeRsp.ccode = HPMFWUPG_COMMAND_IN_PROGRESS; + rsp = &fakeRsp; + } + else if + ( + req.msg.netfn == IPMI_NETFN_PICMG + && + ( req.msg.cmd == HPMFWUPG_GET_UPGRADE_STATUS || + req.msg.cmd == HPMFWUPG_QUERY_ROLLBACK_STATUS ) + ) + { + /* + * rsp == NULL and command get upgrade status or query rollback + * status most likely occurs when we are waiting for firmware + * activation. Try to re-open the IOL session (re-open will work + * once the IPMC recovers from firmware activation. + */ + + lprintf(LOG_DEBUG,"HPM: upg/rollback status firmware API called"); + lprintf(LOG_DEBUG,"HPM: try to re-open IOL session"); + + sleep(inaccessTimeout-inaccessTimeoutCounter); + + /* force session re-open */ + intf->opened = 0; + intf->session->authtype = IPMI_SESSION_AUTHTYPE_NONE; + intf->session->session_id = 0; + intf->session->in_seq = 0; + intf->session->active = 0; + intf->open(intf); + } } } @@ -2118,18 +2175,6 @@ struct ipmi_rs * HpmfwupgSendCmd(struct ipmi_intf *intf, struct ipmi_rq req, retry = 0; } } - else if ( (rsp->ccode == 0xd4) && (strstr(intf->name,"lan")) != NULL ) - { - /* - * We have to re-open the LAN session after inacessiblity - * 0xd4 indicates we have insufficient privilege to exectute - * the command and this is certainly because a reset occured - * on the IPMC. - */ - intf->opened = 0; - intf->open(intf); - retry = 1; - } else { #ifdef ENABLE_OPENIPMI_V39_PATCH