--- x/drivers/bluetooth/hci_uart.h +++ y/drivers/bluetooth/hci_uart.h @@ -69,6 +69,7 @@ struct hci_uart { unsigned long hdev_flags; struct work_struct init_ready; + struct mutex write_mutex; struct work_struct write_work; const struct hci_uart_proto *proto; --- x/drivers/bluetooth/hci_ldisc.c +++ y/drivers/bluetooth/hci_ldisc.c @@ -154,6 +154,7 @@ static void hci_uart_write_work(struct w /* REVISIT: should we cope with bad skbs or ->write() returning * and error value ? */ + mutex_lock(&hu->write_mutex); restart: clear_bit(HCI_UART_TX_WAKEUP, &hu->tx_state); @@ -180,6 +181,7 @@ restart: goto restart; wake_up_bit(&hu->tx_state, HCI_UART_SENDING); + mutex_unlock(&hu->write_mutex); } void hci_uart_init_work(struct work_struct *work) @@ -515,6 +517,7 @@ static int hci_uart_tty_open(struct tty_ INIT_WORK(&hu->init_ready, hci_uart_init_work); INIT_WORK(&hu->write_work, hci_uart_write_work); + mutex_init(&hu->write_mutex); /* Flush any pending characters in the driver */ tty_driver_flush_buffer(tty);