|
@@ -118,10 +118,6 @@ static inline struct sk_buff *hci_uart_dequeue(struct hci_uart *hu)
|
|
|
|
|
|
int hci_uart_tx_wakeup(struct hci_uart *hu)
|
|
|
{
|
|
|
- struct tty_struct *tty = hu->tty;
|
|
|
- struct hci_dev *hdev = hu->hdev;
|
|
|
- struct sk_buff *skb;
|
|
|
-
|
|
|
if (test_and_set_bit(HCI_UART_SENDING, &hu->tx_state)) {
|
|
|
set_bit(HCI_UART_TX_WAKEUP, &hu->tx_state);
|
|
|
return 0;
|
|
@@ -129,6 +125,22 @@ int hci_uart_tx_wakeup(struct hci_uart *hu)
|
|
|
|
|
|
BT_DBG("");
|
|
|
|
|
|
+ schedule_work(&hu->write_work);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static void hci_uart_write_work(struct work_struct *work)
|
|
|
+{
|
|
|
+ struct hci_uart *hu = container_of(work, struct hci_uart, write_work);
|
|
|
+ struct tty_struct *tty = hu->tty;
|
|
|
+ struct hci_dev *hdev = hu->hdev;
|
|
|
+ struct sk_buff *skb;
|
|
|
+
|
|
|
+ /* REVISIT: should we cope with bad skbs or ->write() returning
|
|
|
+ * and error value ?
|
|
|
+ */
|
|
|
+
|
|
|
restart:
|
|
|
clear_bit(HCI_UART_TX_WAKEUP, &hu->tx_state);
|
|
|
|
|
@@ -153,7 +165,6 @@ restart:
|
|
|
goto restart;
|
|
|
|
|
|
clear_bit(HCI_UART_SENDING, &hu->tx_state);
|
|
|
- return 0;
|
|
|
}
|
|
|
|
|
|
static void hci_uart_init_work(struct work_struct *work)
|
|
@@ -282,6 +293,7 @@ static int hci_uart_tty_open(struct tty_struct *tty)
|
|
|
tty->receive_room = 65536;
|
|
|
|
|
|
INIT_WORK(&hu->init_ready, hci_uart_init_work);
|
|
|
+ INIT_WORK(&hu->write_work, hci_uart_write_work);
|
|
|
|
|
|
spin_lock_init(&hu->rx_lock);
|
|
|
|
|
@@ -319,6 +331,8 @@ static void hci_uart_tty_close(struct tty_struct *tty)
|
|
|
if (hdev)
|
|
|
hci_uart_close(hdev);
|
|
|
|
|
|
+ cancel_work_sync(&hu->write_work);
|
|
|
+
|
|
|
if (test_and_clear_bit(HCI_UART_PROTO_SET, &hu->flags)) {
|
|
|
if (hdev) {
|
|
|
if (test_bit(HCI_UART_REGISTERED, &hu->flags))
|