mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 02:21:52 +09:00
Revert "i3c: master: Fix dynamic address leak when 'assigned-address' is present"
This reverts commit 8c77c55f45 which is
commit 851bd21cdb55e727ab29280bc9f6b678164f802a upstream.
It breaks the Android kernel abi and can be brought back in the future
in an abi-safe way if it is really needed.
Bug: 161946584
Change-Id: I1b3dbe3ece19354d604b386d3d99f5456f290d0b
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -1491,9 +1491,16 @@ static int i3c_master_reattach_i3c_dev(struct i3c_dev_desc *dev,
|
||||
u8 old_dyn_addr)
|
||||
{
|
||||
struct i3c_master_controller *master = i3c_dev_get_master(dev);
|
||||
enum i3c_addr_slot_status status;
|
||||
int ret;
|
||||
|
||||
if (dev->info.dyn_addr != old_dyn_addr) {
|
||||
if (dev->info.dyn_addr != old_dyn_addr &&
|
||||
(!dev->boardinfo ||
|
||||
dev->info.dyn_addr != dev->boardinfo->init_dyn_addr)) {
|
||||
status = i3c_bus_get_addr_slot_status(&master->bus,
|
||||
dev->info.dyn_addr);
|
||||
if (status != I3C_ADDR_SLOT_FREE)
|
||||
return -EBUSY;
|
||||
i3c_bus_set_addr_slot_status(&master->bus,
|
||||
dev->info.dyn_addr,
|
||||
I3C_ADDR_SLOT_I3C_DEV);
|
||||
@@ -1895,10 +1902,9 @@ static int i3c_master_bus_init(struct i3c_master_controller *master)
|
||||
goto err_rstdaa;
|
||||
}
|
||||
|
||||
/* Do not mark as occupied until real device exist in bus */
|
||||
i3c_bus_set_addr_slot_status_mask(&master->bus,
|
||||
i3cboardinfo->init_dyn_addr,
|
||||
I3C_ADDR_SLOT_EXT_DESIRED,
|
||||
I3C_ADDR_SLOT_I3C_DEV | I3C_ADDR_SLOT_EXT_DESIRED,
|
||||
I3C_ADDR_SLOT_EXT_STATUS_MASK);
|
||||
|
||||
/*
|
||||
@@ -2062,8 +2068,7 @@ int i3c_master_add_i3c_dev_locked(struct i3c_master_controller *master,
|
||||
else
|
||||
expected_dyn_addr = newdev->info.dyn_addr;
|
||||
|
||||
if (newdev->info.dyn_addr != expected_dyn_addr &&
|
||||
i3c_bus_get_addr_slot_status(&master->bus, expected_dyn_addr) == I3C_ADDR_SLOT_FREE) {
|
||||
if (newdev->info.dyn_addr != expected_dyn_addr) {
|
||||
/*
|
||||
* Try to apply the expected dynamic address. If it fails, keep
|
||||
* the address assigned by the master.
|
||||
|
||||
Reference in New Issue
Block a user