container_of(wk, struct iwl_trans_pcie_removal, work);
        struct pci_dev *pdev = removal->pdev;
        static char *prop[] = {"EVENT=INACCESSIBLE", NULL};
-       struct pci_bus *bus = pdev->bus;
+       struct pci_bus *bus;
+
+       pci_lock_rescan_remove();
+
+       bus = pdev->bus;
+       /* in this case, something else already removed the device */
+       if (!bus)
+               goto out;
 
        dev_err(&pdev->dev, "Device gone - attempting removal\n");
+
        kobject_uevent_env(&pdev->dev.kobj, KOBJ_CHANGE, prop);
-       pci_lock_rescan_remove();
-       pci_dev_put(pdev);
+
        pci_stop_and_remove_bus_device(pdev);
-       if (removal->rescan && bus) {
+       pci_dev_put(pdev);
+
+       if (removal->rescan) {
                if (bus->parent)
                        bus = bus->parent;
                pci_rescan_bus(bus);
        }
+
+out:
        pci_unlock_rescan_remove();
 
        kfree(removal);