|
@@ -316,9 +316,26 @@ void hci_conn_add_sysfs(struct hci_conn *conn)
|
|
|
schedule_work(&conn->work);
|
|
|
}
|
|
|
|
|
|
+static int __match_tty(struct device *dev, void *data)
|
|
|
+{
|
|
|
+ /* The rfcomm tty device will possibly retain even when conn
|
|
|
+ * is down, and sysfs doesn't support move zombie device,
|
|
|
+ * so we should move the device before conn device is destroyed.
|
|
|
+ * Due to the only child device of hci_conn dev is rfcomm
|
|
|
+ * tty_dev, here just return 1
|
|
|
+ */
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
static void del_conn(struct work_struct *work)
|
|
|
{
|
|
|
+ struct device *dev;
|
|
|
struct hci_conn *conn = container_of(work, struct hci_conn, work);
|
|
|
+
|
|
|
+ while (dev = device_find_child(&conn->dev, NULL, __match_tty)) {
|
|
|
+ device_move(dev, NULL);
|
|
|
+ put_device(dev);
|
|
|
+ }
|
|
|
device_del(&conn->dev);
|
|
|
put_device(&conn->dev);
|
|
|
}
|