Message ID | 20240820043818.3352614-1-ravindra.yashvant.shinde@nxp.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | i3c: master: Avoid sending DISEC command with old device address. | expand |
On Tue, Aug 20, 2024 at 10:08:17AM +0530, nxf24178 wrote: Avoid use nxp nxf24178 as your name, please update it with your real name. > 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(+) > > 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; > } you can set olddev->ibi->enable = false unconditional. and add comments about why set it to false here. Frank > > i3c_dev_free_ibi_locked(olddev); > -- > 2.46.0 >
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(+)