@@ -374,7 +374,6 @@ static int fsp_msg_set_led_state(struct led_set_cmd *spcn_cmd)
OPAL_INTERNAL_ERROR);
unlock(&led_lock);
- free(spcn_cmd);
return rc;
}
@@ -428,7 +427,6 @@ static int fsp_msg_set_led_state(struct led_set_cmd *spcn_cmd)
msg = fsp_mkmsg(FSP_CMD_SPCN_PASSTHRU, 4,
SPCN_ADDR_MODE_CEC_NODE, cmd_hdr, 0, PSI_DMA_LED_BUF);
if (!msg) {
- free(spcn_cmd);
cmd |= FSP_STATUS_GENERIC_ERROR;
rc = -1;
goto update_fail;
@@ -445,7 +443,6 @@ static int fsp_msg_set_led_state(struct led_set_cmd *spcn_cmd)
if (rc != OPAL_SUCCESS) {
cmd |= FSP_STATUS_GENERIC_ERROR;
fsp_freemsg(msg);
- free(spcn_cmd);
/* Revert LED state update */
update_led_list(spcn_cmd->loc_code, spcn_cmd->ckpt_status,
spcn_cmd->ckpt_excl_bit);
@@ -496,7 +493,12 @@ static int process_led_state_change(void)
spcn_cmd = list_pop(&spcn_cmdq, struct led_set_cmd, link);
unlock(&spcn_cmd_lock);
- fsp_msg_set_led_state(spcn_cmd);
+ rc = fsp_msg_set_led_state(spcn_cmd);
+ if (rc) {
+ free(spcn_cmd);
+ process_led_state_change();
+ }
+
return rc;
}
Presently if fsp_msg_set_led_state() fails then we don't continue processing remaining LED update request...which is not correct. Also free spcn_cmd in one place rather than freeing at every failure block. Signed-off-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com> --- hw/fsp/fsp-leds.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)