linux-pci.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFC PATCH] PCI: hotplug: Fix surprise removal report card present and link failed
@ 2019-01-16 14:31 Dongdong Liu
  2019-01-16 14:22 ` Lukas Wunner
  0 siblings, 1 reply; 4+ messages in thread
From: Dongdong Liu @ 2019-01-16 14:31 UTC (permalink / raw)
  To: helgaas, lukas, lorenzo.pieralisi
  Cc: linux-pci, linuxarm, john.garry, Dongdong Liu

The lspci -tv topology is as below.
 +-[0000:80]-+-00.0-[81]----00.0  Huawei Technologies Co., Ltd. Device 3714
 |           +-02.0-[82]----00.0  Huawei Technologies Co., Ltd. Device 3714
 |           +-04.0-[83]----00.0  Huawei Technologies Co., Ltd. Device 3714
 |           +-06.0-[84]----00.0  Huawei Technologies Co., Ltd. Device 3714
 |           +-10.0-[87]----00.0  Huawei Technologies Co., Ltd. Device 3714

Then surprise removal 87:00.0 NVME SSD card. The message is as below.

pciehp 0000:80:10.0:pcie004: Slot(36): Link Down
iommu: Removing device 0000:87:00.0 from group 12
pciehp 0000:80:10.0:pcie004: Slot(36): Card present
pcieport 0000:80:10.0: Data Link Layer Link Active not set in 1000 msec
pciehp 0000:80:10.0:pcie004: Failed to check link status

Then lspci -s 80:10.0 -vvv|grep -i SltSta
SltSta:Status: AttnBtn- PowerFlt- MRL- CmdCplt- PresDet- Interlock
We can see the card is not present (PresDet-).

pciehp 0000:80:10.0:pcie004: Slot #36 AttnBtn- PwrCtrl- MRL- AttnInd+
PwrInd+ HotPlug+ Surprise+ Interlock- NoCompl- LLActRep+

The NVME SSD card is permited to surprise removal with slot power on
on the D06 board. The hotplug port's POWER_CTRL(ctrl) is false.

Data link layer state changed (link down) event reported prior to presence
detect changed (card is not present) when surprise removal.

Current code pciehp_handle_presence_or_link_change() handle link down event,
then check the card present, but at this time presence detect state have
not updated, so have such issue. If surprise removal and power controller
present is not implemented, wait for at least 1 second before checking
card present to fix the issue.

Signed-off-by: Dongdong Liu <liudongdong3@huawei.com>
---
 drivers/pci/hotplug/pciehp_ctrl.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/drivers/pci/hotplug/pciehp_ctrl.c b/drivers/pci/hotplug/pciehp_ctrl.c
index 3f3df4c..ef8952d 100644
--- a/drivers/pci/hotplug/pciehp_ctrl.c
+++ b/drivers/pci/hotplug/pciehp_ctrl.c
@@ -216,6 +216,7 @@ void pciehp_handle_disable_request(struct controller *ctrl)
 void pciehp_handle_presence_or_link_change(struct controller *ctrl, u32 events)
 {
 	bool present, link_active;
+	bool safe_removal = SAFE_REMOVAL;
 
 	/*
 	 * If the slot is on and presence or link has changed, turn it off.
@@ -236,6 +237,7 @@ void pciehp_handle_presence_or_link_change(struct controller *ctrl, u32 events)
 			ctrl_info(ctrl, "Slot(%s): Card not present\n",
 				  slot_name(ctrl));
 		pciehp_disable_slot(ctrl, SURPRISE_REMOVAL);
+		safe_removal = SURPRISE_REMOVAL;
 		break;
 	default:
 		mutex_unlock(&ctrl->state_lock);
@@ -244,6 +246,15 @@ void pciehp_handle_presence_or_link_change(struct controller *ctrl, u32 events)
 
 	/* Turn the slot on if it's occupied or link is up */
 	mutex_lock(&ctrl->state_lock);
+	/*
+	 * if surprise removal and power controller present is not implemented,
+	 * wait for at least 1 second before checking card present as
+	 * data link layer state changed (link down) event reported
+	 * prior to presence detect changed (card is not present).
+	 */
+	if (!safe_removal && !POWER_CTRL(ctrl))
+		msleep(1000);
+
 	present = pciehp_card_present(ctrl);
 	link_active = pciehp_check_link_active(ctrl);
 	if (!present && !link_active) {
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2019-01-17 18:30 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-01-16 14:31 [RFC PATCH] PCI: hotplug: Fix surprise removal report card present and link failed Dongdong Liu
2019-01-16 14:22 ` Lukas Wunner
2019-01-17 12:07   ` Dongdong Liu
2019-01-17 18:30     ` Lukas Wunner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).