}
 EXPORT_SYMBOL_GPL(btbcm_initialize);
 
-int btbcm_finalize(struct hci_dev *hdev)
+int btbcm_finalize(struct hci_dev *hdev, bool *fw_load_done)
 {
-       bool fw_load_done = true;
        int err;
 
-       /* Re-initialize */
-       err = btbcm_initialize(hdev, &fw_load_done);
-       if (err)
-               return err;
+       /* Re-initialize if necessary */
+       if (*fw_load_done) {
+               err = btbcm_initialize(hdev, fw_load_done);
+               if (err)
+                       return err;
+       }
 
        btbcm_check_bdaddr(hdev);
 
        if (err)
                return err;
 
-       if (!fw_load_done)
-               goto done;
-
        /* Re-initialize after loading Patch */
-       err = btbcm_initialize(hdev, &fw_load_done);
-       if (err)
-               return err;
-
-done:
-       btbcm_check_bdaddr(hdev);
-
-       set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
-
-       return 0;
+       return btbcm_finalize(hdev, &fw_load_done);
 }
 EXPORT_SYMBOL_GPL(btbcm_setup_patchram);
 
 
 int btbcm_setup_apple(struct hci_dev *hdev);
 
 int btbcm_initialize(struct hci_dev *hdev, bool *fw_load_done);
-int btbcm_finalize(struct hci_dev *hdev);
+int btbcm_finalize(struct hci_dev *hdev, bool *fw_load_done);
 
 #else
 
        return 0;
 }
 
-static inline int btbcm_finalize(struct hci_dev *hdev)
+static inline int btbcm_finalize(struct hci_dev *hdev, bool *fw_load_done)
 {
        return 0;
 }
 
                btbcm_write_pcm_int_params(hu->hdev, ¶ms);
        }
 
-       err = btbcm_finalize(hu->hdev);
+       err = btbcm_finalize(hu->hdev, &fw_load_done);
        if (err)
                return err;