diff
+	bool device_valid = true;
 	msft_unregister(hdev);
+	if (!hdev || hdev->flags & HCI_UNREGISTERED)
+		device_valid = false;
 
 	hci_dev_do_close(hdev);
 
-	if (!test_bit(HCI_INIT, &hdev->flags) &&
+	if (device_valid && !test_bit(HCI_INIT, &hdev->flags) &&
 	    !hci_dev_test_flag(hdev, HCI_SETUP) &&
 	    !hci_dev_test_flag(hdev, HCI_CONFIG)) {
 		hci_dev_lock(hdev);
@@ -33,6 +35,6 @@ void hci_unregister_dev(struct hci_dev *hdev)
 
 	hci_sock_dev_event(hdev, HCI_DEV_UNREG);
 
-	if (hdev->rfkill) {
+	if (device_valid && hdev->rfkill) {
 		rfkill_unregister(hdev->rfkill);
