Hi Cheng, On Wed, Sep 25, 2024 at 5:10 AM Cheng Jiang <quic_chejiang@xxxxxxxxxxx> wrote: > > For a combo mode remote, both BR/EDR and BLE may be connected. > RemoveDevice should be handled after all bearers are dropped, > otherwise, remove device is not performed in adapter_remove_connection. > --- > src/device.c | 12 +++++++++++- > 1 file changed, 11 insertions(+), 1 deletion(-) > > diff --git a/src/device.c b/src/device.c > index f8f61e643..c25bf6b60 100644 > --- a/src/device.c > +++ b/src/device.c > @@ -3492,8 +3492,18 @@ void device_remove_connection(struct btd_device *device, uint8_t bdaddr_type, > DBusMessage *msg = device->disconnects->data; > > if (dbus_message_is_method_call(msg, ADAPTER_INTERFACE, > - "RemoveDevice")) > + "RemoveDevice")) { > + > + /* Don't handle the RemoveDevice msg if device is > + * connected. For a dual mode remote, both BR/EDR > + * and BLE may be connected, RemoveDevice should > + * be handled after all bearers are disconnects. > + */ > + if (device->bredr_state.connected || > + device->le_state.connected) > + break; While this seems to make sense further down there is the same state: line 3531: if (device->bredr_state.connected || device->le_state.connected) So what this is doing is just to avoid removing the msg from device->disconnects but perhaps I'm missing something. > remove_device = true; > + } > > g_dbus_send_reply(dbus_conn, msg, DBUS_TYPE_INVALID); > device->disconnects = g_slist_remove(device->disconnects, msg); > -- > 2.25.1 > > -- Luiz Augusto von Dentz