diff --git a/drivers/pci/hotplug/pciehp.h b/drivers/pci/hotplug/pciehp.h index c4d3b035f619d715a8cc8e28af1ff4972e01c72b..a4b294fddc93941dd813d4feb1ae2e46abc00f9c 100644 --- a/drivers/pci/hotplug/pciehp.h +++ b/drivers/pci/hotplug/pciehp.h @@ -126,7 +126,7 @@ struct controller { unsigned int power_fault_detected; atomic_t pending_events; int request_result; - struct completion requester; + wait_queue_head_t requester; }; /** diff --git a/drivers/pci/hotplug/pciehp_ctrl.c b/drivers/pci/hotplug/pciehp_ctrl.c index e12f62b234d423a271668df098c6ea6d0d8a4dbe..b6274e58f95d9f8ee056dec90e3005c18114f056 100644 --- a/drivers/pci/hotplug/pciehp_ctrl.c +++ b/drivers/pci/hotplug/pciehp_ctrl.c @@ -403,9 +403,9 @@ int pciehp_sysfs_enable_slot(struct slot *p_slot) * card before the thread wakes up, so initialize to -ENODEV. */ ctrl->request_result = -ENODEV; - reinit_completion(&ctrl->requester); pciehp_request(ctrl, PCI_EXP_SLTSTA_PDC); - wait_for_completion(&ctrl->requester); + wait_event(ctrl->requester, + !atomic_read(&ctrl->pending_events)); return ctrl->request_result; case POWERON_STATE: ctrl_info(ctrl, "Slot(%s): Already in powering on state\n", @@ -436,9 +436,9 @@ int pciehp_sysfs_disable_slot(struct slot *p_slot) case BLINKINGOFF_STATE: case ON_STATE: mutex_unlock(&p_slot->lock); - reinit_completion(&ctrl->requester); pciehp_request(ctrl, DISABLE_SLOT); - wait_for_completion(&ctrl->requester); + wait_event(ctrl->requester, + !atomic_read(&ctrl->pending_events)); return ctrl->request_result; case POWEROFF_STATE: ctrl_info(ctrl, "Slot(%s): Already in powering off state\n", diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_hpc.c index 50d856f9534d2bd880f04275eb0ebded867daff0..43bb78122795a9de7df5488886746b1a5f660fe8 100644 --- a/drivers/pci/hotplug/pciehp_hpc.c +++ b/drivers/pci/hotplug/pciehp_hpc.c @@ -739,7 +739,7 @@ static irqreturn_t pciehp_ist(int irq, void *dev_id) up_read(&ctrl->reset_lock); pci_config_pm_runtime_put(pdev); - complete(&ctrl->requester); + wake_up(&ctrl->requester); return IRQ_HANDLED; } @@ -953,7 +953,7 @@ struct controller *pcie_init(struct pcie_device *dev) ctrl->slot_cap = slot_cap; mutex_init(&ctrl->ctrl_lock); init_rwsem(&ctrl->reset_lock); - init_completion(&ctrl->requester); + init_waitqueue_head(&ctrl->requester); init_waitqueue_head(&ctrl->queue); dbg_ctrl(ctrl);