[PATCH v5 2/3] firmware: arm_scmi: Fix scmi_protocol_table_register() error handling
Hans de Goede
johannes.goede at oss.qualcomm.com
Wed Sep 2 11:08:43 PDT 2026
scmi_protocol_table_register() stops at the first failure to request
one of the scmi_device_id-s into scmi_requested_devices, but it leaves any
previously successfully requested device-ids in place.
Unrequest any successfully requested device-ids on error to fix this.
The code manually unrequests these rather then calling
scmi_protocol_table_unregister() because one way this can fail is because
of duplicate device-ids and in that case the original device-id must not
be unrequested.
This also moves scmi_protocol_table_register() to below
scmi_protocol_device_unrequest() since it now calls that local function.
Signed-off-by: Hans de Goede <johannes.goede at oss.qualcomm.com>
---
Changes in v5:
- New patch in v5 of this series
---
drivers/firmware/arm_scmi/bus.c | 30 +++++++++++++++++++-----------
1 file changed, 19 insertions(+), 11 deletions(-)
diff --git a/drivers/firmware/arm_scmi/bus.c b/drivers/firmware/arm_scmi/bus.c
index d12d5de15a1a..6f667e4ffeed 100644
--- a/drivers/firmware/arm_scmi/bus.c
+++ b/drivers/firmware/arm_scmi/bus.c
@@ -137,17 +137,6 @@ static int scmi_protocol_device_request(const struct scmi_device_id *id_table)
return ret;
}
-static int scmi_protocol_table_register(const struct scmi_device_id *id_table)
-{
- int ret = 0;
- const struct scmi_device_id *entry;
-
- for (entry = id_table; entry->name[0] && ret == 0; entry++)
- ret = scmi_protocol_device_request(entry);
-
- return ret;
-}
-
/**
* scmi_protocol_device_unrequest - Helper to unrequest a device
*
@@ -193,6 +182,25 @@ static void scmi_protocol_device_unrequest(const struct scmi_device_id *id_table
mutex_unlock(&scmi_requested_devices_mtx);
}
+static int scmi_protocol_table_register(const struct scmi_device_id *id_table)
+{
+ int i, ret;
+
+ for (i = 0; id_table[i].name[0]; i++) {
+ ret = scmi_protocol_device_request(&id_table[i]);
+ if (ret)
+ goto error;
+ }
+
+ return 0;
+
+error:
+ while (--i >= 0)
+ scmi_protocol_device_unrequest(&id_table[i]);
+
+ return ret;
+}
+
static void
scmi_protocol_table_unregister(const struct scmi_device_id *id_table)
{
--
2.55.0
More information about the linux-arm-kernel
mailing list