Skip to content

Commit 2debd92

Browse files
Yinghai Lujbarnes993
authored andcommitted
PCI: pciehp: Disable/enable link during slot power off/on
On a system with a repeater on the system board to support gen2 hotplug, we found that when an ExpressModule is removed from some slots, /var/log/messages will be full of "card present/not present" warnings. It turns out the root complex is continually trying to train the link to the repeater because the repeater has not been reset. This patch will disable the link at removal time to allow the repeater to be reset properly. This also prevents a potential AER message at removal time. Also, when testing hotplug on a system under development, we found if we boot the system without an EM installed, and later hot-add an EM, it does not work with Linux, but another OS is ok. The root cause is that BIOS left link disabled when slot was empty at boot time, and other OS is modifying the link disable bit in link ctrl during power on/off. So we should do the same thing to disable/enable link during power off/on. -v2: check link DLLA bit instead of 100ms waiting. Separate link disable/enable functions to another patch. Signed-off-by: Yinghai Lu <[email protected]> Signed-off-by: Jesse Barnes <[email protected]>
1 parent 7f82299 commit 2debd92

File tree

1 file changed

+12
-0
lines changed

1 file changed

+12
-0
lines changed

drivers/pci/hotplug/pciehp_hpc.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -606,6 +606,10 @@ int pciehp_power_on_slot(struct slot * slot)
606606
ctrl_dbg(ctrl, "%s: SLOTCTRL %x write cmd %x\n", __func__,
607607
pci_pcie_cap(ctrl->pcie->port) + PCI_EXP_SLTCTL, slot_cmd);
608608

609+
retval = pciehp_link_enable(ctrl);
610+
if (retval)
611+
ctrl_err(ctrl, "%s: Can not enable the link!\n", __func__);
612+
609613
return retval;
610614
}
611615

@@ -616,6 +620,14 @@ int pciehp_power_off_slot(struct slot * slot)
616620
u16 cmd_mask;
617621
int retval;
618622

623+
/* Disable the link at first */
624+
pciehp_link_disable(ctrl);
625+
/* wait the link is down */
626+
if (ctrl->link_active_reporting)
627+
pcie_wait_link_not_active(ctrl);
628+
else
629+
msleep(1000);
630+
619631
slot_cmd = POWER_OFF;
620632
cmd_mask = PCI_EXP_SLTCTL_PCC;
621633
retval = pcie_write_cmd(ctrl, slot_cmd, cmd_mask);

0 commit comments

Comments
 (0)