diff
+	kref_get(&hdev->kref);
 	msft_unregister(hdev);
 
 	hci_dev_do_close(hdev);
@@ -33,6 +34,8 @@ void hci_unregister_dev(struct hci_dev *hdev)
 
 	hci_sock_dev_event(hdev, HCI_DEV_UNREG);
 
-	if (hdev->rfkill) {
+	if (kref_read(&hdev->kref) == 1 && hdev->rfkill) {
 		rfkill_unregister(hdev->rfkill);
+		hdev->rfkill = NULL;
 	}
+	kref_put(&hdev->kref, hci_dev_release);
