Skip to content

Commit

Permalink
PCI: pciehp: Don't re-read Slot Status when queuing hotplug event
Browse files Browse the repository at this point in the history
Previously we read Slot Status to learn about hotplug events, then cleared
the events, then re-read Slot Status to find out what happened.  But Slot
Status might have changed before the second read.

Capture the Slot Status once before clearing the events.  Also capture the
Link Status if we had a link status change.

[bhelgaas: changelog, split to separate patch]
Tested-by: Lukas Wunner <lukas@wunner.de>
Signed-off-by: Mayurkumar Patel <mayurkumar.patel@intel.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
  • Loading branch information
Mayurkumar Patel authored and Bjorn Helgaas committed Sep 14, 2016
1 parent fad214b commit 0c923d1
Showing 1 changed file with 5 additions and 2 deletions.
7 changes: 5 additions & 2 deletions drivers/pci/hotplug/pciehp_hpc.c
Original file line number Diff line number Diff line change
Expand Up @@ -566,6 +566,10 @@ static irqreturn_t pciehp_isr(int irq, void *dev_id)
if (!events)
return IRQ_NONE;

/* Capture link status before clearing interrupts */
if (events & PCI_EXP_SLTSTA_DLLSC)
link = pciehp_check_link_active(ctrl);

pcie_capability_write_word(pdev, PCI_EXP_SLTSTA, events);
ctrl_dbg(ctrl, "pending interrupts %#06x from Slot Status\n", events);

Expand Down Expand Up @@ -598,7 +602,7 @@ static irqreturn_t pciehp_isr(int irq, void *dev_id)

/* Check Presence Detect Changed */
if (events & PCI_EXP_SLTSTA_PDC) {
pciehp_get_adapter_status(slot, &present);
present = !!(status & PCI_EXP_SLTSTA_PDS);
ctrl_info(ctrl, "Card %spresent on Slot(%s)\n",
present ? "" : "not ", slot_name(slot));
pciehp_queue_interrupt_event(slot, present ? INT_PRESENCE_ON :
Expand All @@ -613,7 +617,6 @@ static irqreturn_t pciehp_isr(int irq, void *dev_id)
}

if (events & PCI_EXP_SLTSTA_DLLSC) {
link = pciehp_check_link_active(ctrl);
ctrl_info(ctrl, "slot(%s): Link %s event\n",
slot_name(slot), link ? "Up" : "Down");
pciehp_queue_interrupt_event(slot, link ? INT_LINK_UP :
Expand Down

0 comments on commit 0c923d1

Please sign in to comment.