Message ID | 20240820041842.3291130-1-ravindra.yashvant.shinde@nxp.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | i3c: master: Remove i3c_dev_disable_ibi_locked(olddev) on device hotjoin | expand |
diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c index 7028f03c2c42..07ccb2c00074 100644 --- a/drivers/i3c/master.c +++ b/drivers/i3c/master.c @@ -2042,6 +2042,7 @@ int i3c_master_add_i3c_dev_locked(struct i3c_master_controller *master, if (olddev->ibi->enabled) { enable_ibi = true; i3c_dev_disable_ibi_locked(olddev); + olddev->ibi->enabled = false; } i3c_dev_free_ibi_locked(olddev);
When a new device hotjoins, a new dynamic address is assigned. i3c_master_add_i3c_dev_locked() identifies that the device was previously attached to the bus and locates the olddev. i3c_master_add_i3c_dev_locked() { ... olddev = i3c_master_search_i3c_dev_duplicate(newdev); ... if (olddev) { enable_ibi = true; ... } i3c_dev_free_ibi_locked(olddev); ^^^^^^^^ This function internally calls i3c_dev_disable_ibi_locked(addr) function causing to send DISEC command with old Address. The olddev should not receive any commands on the i3c bus as it does not exist and has been assigned a new address. This will result in NACK or timeout. So, update the olddev->ibi->enabled flag to false to avoid DISEC with OldAddr. ... } Signed-off-by: Ravindra Yashvant Shinde <ravindra.yashvant.shinde@nxp.com> --- drivers/i3c/master.c | 1 + 1 file changed, 1 insertion(+)