Commit 44dbdf3b authored by Ludvig Pärsson's avatar Ludvig Pärsson Committed by Sudeep Holla

firmware: arm_scmi: Fix incorrect error propagation in scmi_voltage_descriptors_get

scmi_voltage_descriptors_get() will incorrecly return an error code if
the last iteration of the for loop that retrieves the descriptors is
skipped due to an error. Skipping an iteration in the loop is not an
error, but the `ret` value from the last iteration will be propagated
when the function returns.

Fix by not saving return values that should not be propagated. This
solution also minimizes the risk of future patches accidentally
re-introducing this bug.

Link: https://lore.kernel.org/r/20220610140055.31491-1-ludvig.parsson@axis.comReviewed-by: default avatarCristian Marussi <cristian.marussi@arm.com>
Signed-off-by: default avatarLudvig Pärsson <ludvig.parsson@axis.com>
[sudeep.holla: Removed unneeded reset_rx_to_maxsz and check for return
value from scmi_voltage_levels_get as suggested by Cristian]
Signed-off-by: default avatarSudeep Holla <sudeep.holla@arm.com>
parent 4314f9f4
...@@ -225,9 +225,8 @@ static int scmi_voltage_descriptors_get(const struct scmi_protocol_handle *ph, ...@@ -225,9 +225,8 @@ static int scmi_voltage_descriptors_get(const struct scmi_protocol_handle *ph,
/* Retrieve domain attributes at first ... */ /* Retrieve domain attributes at first ... */
put_unaligned_le32(dom, td->tx.buf); put_unaligned_le32(dom, td->tx.buf);
ret = ph->xops->do_xfer(ph, td);
/* Skip domain on comms error */ /* Skip domain on comms error */
if (ret) if (ph->xops->do_xfer(ph, td))
continue; continue;
v = vinfo->domains + dom; v = vinfo->domains + dom;
...@@ -249,12 +248,8 @@ static int scmi_voltage_descriptors_get(const struct scmi_protocol_handle *ph, ...@@ -249,12 +248,8 @@ static int scmi_voltage_descriptors_get(const struct scmi_protocol_handle *ph,
v->async_level_set = true; v->async_level_set = true;
} }
ret = scmi_voltage_levels_get(ph, v);
/* Skip invalid voltage descriptors */ /* Skip invalid voltage descriptors */
if (ret) scmi_voltage_levels_get(ph, v);
continue;
ph->xops->reset_rx_to_maxsz(ph, td);
} }
ph->xops->xfer_put(ph, td); ph->xops->xfer_put(ph, td);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment