[PATCH 1/5] i3c: master: Move rstdaa error suppression

Jorge Marques jorge.marques at analog.com
Sun Mar 8 09:47:37 PDT 2026


The CCC RSTDAA is invoked with i3c_master_rstdaa_locked
even if there are no devices active on the bus, resulting
in error I3C_ERROR_M2. Handle inside i3c_master_rstdaa_locked,
checking cmd->err directly.

Signed-off-by: Jorge Marques <jorge.marques at analog.com>
---
 drivers/i3c/master.c | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c
index 9e6be49bebb2..31822fd5ffde 100644
--- a/drivers/i3c/master.c
+++ b/drivers/i3c/master.c
@@ -1016,6 +1016,10 @@ static int i3c_master_rstdaa_locked(struct i3c_master_controller *master,
 	ret = i3c_master_send_ccc_cmd_locked(master, &cmd);
 	i3c_ccc_cmd_dest_cleanup(&dest);
 
+	/* No active devices on the bus. */
+	if (ret && cmd.err == I3C_ERROR_M2)
+		ret = 0;
+
 	return ret;
 }
 
@@ -1785,7 +1789,6 @@ i3c_master_register_new_i3c_devs(struct i3c_master_controller *master)
  */
 int i3c_master_do_daa_ext(struct i3c_master_controller *master, bool rstdaa)
 {
-	int rstret = 0;
 	int ret;
 
 	ret = i3c_master_rpm_get(master);
@@ -1795,9 +1798,9 @@ int i3c_master_do_daa_ext(struct i3c_master_controller *master, bool rstdaa)
 	i3c_bus_maintenance_lock(&master->bus);
 
 	if (rstdaa) {
-		rstret = i3c_master_rstdaa_locked(master, I3C_BROADCAST_ADDR);
-		if (rstret == I3C_ERROR_M2)
-			rstret = 0;
+		ret = i3c_master_rstdaa_locked(master, I3C_BROADCAST_ADDR);
+		if (ret)
+			goto out;
 	}
 
 	ret = master->ops->do_daa(master);
@@ -1813,7 +1816,7 @@ int i3c_master_do_daa_ext(struct i3c_master_controller *master, bool rstdaa)
 out:
 	i3c_master_rpm_put(master);
 
-	return rstret ?: ret;
+	return ret;
 }
 EXPORT_SYMBOL_GPL(i3c_master_do_daa_ext);
 
@@ -2093,7 +2096,7 @@ static int i3c_master_bus_init(struct i3c_master_controller *master)
 	 * (assigned by the bootloader for example).
 	 */
 	ret = i3c_master_rstdaa_locked(master, I3C_BROADCAST_ADDR);
-	if (ret && ret != I3C_ERROR_M2)
+	if (ret)
 		goto err_bus_cleanup;
 
 	if (master->ops->set_speed) {

-- 
2.51.1




More information about the linux-i3c mailing list