2017-07-08 14:29:46

by Ian Molton

[permalink] [raw]
Subject: Further _remove() cleanup for hci_uart drivers

Hi Marcel,

Here are three untested patches. They introduce a common function
hci_uart_unregister_device().

This cleans up hci_nokia.c further, and fixes a cut-n-paste error that
introduced the same race condition to hci_ll.c (or perhaps the other
way around).

HTH,

-Ian


2017-07-08 14:29:49

by Ian Molton

[permalink] [raw]
Subject: [PATCH 3/3] bluetooth: hci_ll: Use new hci_uart_unregister_device() function.

Convert hci_ll to use hci_uart_unregister_device().

This simplifies the _remove() handler as well as fixes a
potential race condition on unload.

Signed-off-by: Ian Molton <[email protected]>
---
drivers/bluetooth/hci_ll.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/bluetooth/hci_ll.c b/drivers/bluetooth/hci_ll.c
index c982943f0747..20e90fc1f7be 100644
--- a/drivers/bluetooth/hci_ll.c
+++ b/drivers/bluetooth/hci_ll.c
@@ -745,10 +745,8 @@ static void hci_ti_remove(struct serdev_device *serdev)
struct hci_uart *hu = &lldev->hu;
struct hci_dev *hdev = hu->hdev;

- cancel_work_sync(&hu->write_work);
+ hci_uart_unregister_device(hdev);

- hci_unregister_dev(hdev);
- hci_free_dev(hdev);
hu->proto->close(hu);
}

--
2.11.0

2017-07-08 14:29:48

by Ian Molton

[permalink] [raw]
Subject: [PATCH 2/3] bluetooth: Nokia: Use new hci_uart_unregister_device() function.

Simplify _remove() path for hci_nokia.c

Signed-off-by: Ian Molton <[email protected]>
---
drivers/bluetooth/hci_nokia.c | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/drivers/bluetooth/hci_nokia.c b/drivers/bluetooth/hci_nokia.c
index 6dbb1f6ff6bd..1a465dd2970e 100644
--- a/drivers/bluetooth/hci_nokia.c
+++ b/drivers/bluetooth/hci_nokia.c
@@ -770,11 +770,7 @@ static void nokia_bluetooth_serdev_remove(struct serdev_device *serdev)
struct hci_uart *hu = &btdev->hu;
struct hci_dev *hdev = hu->hdev;

-
- hci_unregister_dev(hdev);
- hci_free_dev(hdev);
-
- cancel_work_sync(&hu->write_work);
+ hci_uart_unregister_device(hdev);

hu->proto->close(hu);
}
--
2.11.0

2017-07-08 14:29:47

by Ian Molton

[permalink] [raw]
Subject: [PATCH 1/3] bluetooth: Introduce hci_uart_unregister_device()

Several drivers have the same (and incorrect) code in their
_remove() handler.

Coalesce this into a shared function.


Signed-off-by: Ian Molton <[email protected]>
---
drivers/bluetooth/hci_serdev.c | 10 ++++++++++
drivers/bluetooth/hci_uart.h | 1 +
2 files changed, 11 insertions(+)

diff --git a/drivers/bluetooth/hci_serdev.c b/drivers/bluetooth/hci_serdev.c
index aea930101dd2..20e356168156 100644
--- a/drivers/bluetooth/hci_serdev.c
+++ b/drivers/bluetooth/hci_serdev.c
@@ -354,3 +354,13 @@ int hci_uart_register_device(struct hci_uart *hu,
return err;
}
EXPORT_SYMBOL_GPL(hci_uart_register_device);
+
+void hci_uart_unregister_device(struct hci_uart *hu) {
+ struct hci_dev *hdev = hu->hdev;
+
+ hci_unregister_dev(hdev);
+ hci_free_dev(hdev);
+
+ cancel_work_sync(&hu->write_work);
+}
+EXPORT_SYMBOL_GPL(hci_uart_unregister_device);
diff --git a/drivers/bluetooth/hci_uart.h b/drivers/bluetooth/hci_uart.h
index c6e9e1cf63f8..d9cd95d81149 100644
--- a/drivers/bluetooth/hci_uart.h
+++ b/drivers/bluetooth/hci_uart.h
@@ -112,6 +112,7 @@ struct hci_uart {
int hci_uart_register_proto(const struct hci_uart_proto *p);
int hci_uart_unregister_proto(const struct hci_uart_proto *p);
int hci_uart_register_device(struct hci_uart *hu, const struct hci_uart_proto *p);
+void hci_uart_unregister_device(struct hci_uart *hu);

int hci_uart_tx_wakeup(struct hci_uart *hu);
int hci_uart_init_ready(struct hci_uart *hu);
--
2.11.0