if (!skb) {
                percpu_down_read(&hu->proto_lock);
 
-               if (test_bit(HCI_UART_PROTO_READY, &hu->flags))
+               if (test_bit(HCI_UART_PROTO_READY, &hu->flags) ||
+                   test_bit(HCI_UART_PROTO_INIT, &hu->flags))
                        skb = hu->proto->dequeue(hu);
 
                percpu_up_read(&hu->proto_lock);
        if (!percpu_down_read_trylock(&hu->proto_lock))
                return 0;
 
-       if (!test_bit(HCI_UART_PROTO_READY, &hu->flags))
+       if (!test_bit(HCI_UART_PROTO_READY, &hu->flags) &&
+           !test_bit(HCI_UART_PROTO_INIT, &hu->flags))
                goto no_schedule;
 
        set_bit(HCI_UART_TX_WAKEUP, &hu->tx_state);
 
        percpu_down_read(&hu->proto_lock);
 
-       if (!test_bit(HCI_UART_PROTO_READY, &hu->flags)) {
+       if (!test_bit(HCI_UART_PROTO_READY, &hu->flags) &&
+           !test_bit(HCI_UART_PROTO_INIT, &hu->flags)) {
                percpu_up_read(&hu->proto_lock);
                return -EUNATCH;
        }
        if (tty != hu->tty)
                return;
 
-       if (test_bit(HCI_UART_PROTO_READY, &hu->flags))
+       if (test_bit(HCI_UART_PROTO_READY, &hu->flags) ||
+           test_bit(HCI_UART_PROTO_INIT, &hu->flags))
                hci_uart_tx_wakeup(hu);
 }
 
 
        percpu_down_read(&hu->proto_lock);
 
-       if (!test_bit(HCI_UART_PROTO_READY, &hu->flags)) {
+       if (!test_bit(HCI_UART_PROTO_READY, &hu->flags) &&
+           !test_bit(HCI_UART_PROTO_INIT, &hu->flags)) {
                percpu_up_read(&hu->proto_lock);
                return;
        }
 
        hu->proto = p;
 
-       set_bit(HCI_UART_PROTO_READY, &hu->flags);
+       set_bit(HCI_UART_PROTO_INIT, &hu->flags);
 
        err = hci_uart_register_dev(hu);
        if (err) {
                return err;
        }
 
+       set_bit(HCI_UART_PROTO_READY, &hu->flags);
+       clear_bit(HCI_UART_PROTO_INIT, &hu->flags);
+
        return 0;
 }