|
@@ -496,7 +496,7 @@ int pciehp_power_on_slot(struct slot *slot)
|
|
|
u16 slot_status;
|
|
|
int retval;
|
|
|
|
|
|
- /* Clear sticky power-fault bit from previous power failures */
|
|
|
+ /* Clear power-fault bit from previous power failures */
|
|
|
pcie_capability_read_word(pdev, PCI_EXP_SLTSTA, &slot_status);
|
|
|
if (slot_status & PCI_EXP_SLTSTA_PFD)
|
|
|
pcie_capability_write_word(pdev, PCI_EXP_SLTSTA,
|
|
@@ -646,6 +646,14 @@ static irqreturn_t pciehp_ist(int irq, void *dev_id)
|
|
|
pciehp_handle_button_press(slot);
|
|
|
}
|
|
|
|
|
|
+ /* Check Power Fault Detected */
|
|
|
+ if ((events & PCI_EXP_SLTSTA_PFD) && !ctrl->power_fault_detected) {
|
|
|
+ ctrl->power_fault_detected = 1;
|
|
|
+ ctrl_err(ctrl, "Slot(%s): Power fault\n", slot_name(slot));
|
|
|
+ pciehp_set_attention_status(slot, 1);
|
|
|
+ pciehp_green_led_off(slot);
|
|
|
+ }
|
|
|
+
|
|
|
/*
|
|
|
* Disable requests have higher priority than Presence Detect Changed
|
|
|
* or Data Link Layer State Changed events.
|
|
@@ -657,14 +665,6 @@ static irqreturn_t pciehp_ist(int irq, void *dev_id)
|
|
|
pciehp_handle_presence_or_link_change(slot, events);
|
|
|
up_read(&ctrl->reset_lock);
|
|
|
|
|
|
- /* Check Power Fault Detected */
|
|
|
- if ((events & PCI_EXP_SLTSTA_PFD) && !ctrl->power_fault_detected) {
|
|
|
- ctrl->power_fault_detected = 1;
|
|
|
- ctrl_err(ctrl, "Slot(%s): Power fault\n", slot_name(slot));
|
|
|
- pciehp_set_attention_status(slot, 1);
|
|
|
- pciehp_green_led_off(slot);
|
|
|
- }
|
|
|
-
|
|
|
pci_config_pm_runtime_put(pdev);
|
|
|
wake_up(&ctrl->requester);
|
|
|
return IRQ_HANDLED;
|