summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuo Jiaxing <luojiaxing@huawei.com>2020-05-15 22:13:42 +0800
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2020-06-24 17:48:25 +0200
commit56ccaf8e87dc35a9067525cb47a71a25964b1a3e (patch)
treee1e03ddb444fa7268648cb3097df3b33d6754fb8
parent40f5ea91d22292cf6ca8f9569df64c0563ae4c58 (diff)
downloadlinux-stable-56ccaf8e87dc35a9067525cb47a71a25964b1a3e.tar.gz
linux-stable-56ccaf8e87dc35a9067525cb47a71a25964b1a3e.tar.bz2
linux-stable-56ccaf8e87dc35a9067525cb47a71a25964b1a3e.zip
scsi: hisi_sas: Do not reset phy timer to wait for stray phy up
[ Upstream commit e16b9ed61e078d836a0f24a82080cf29d7539c7e ] We found out that after phy up, the hardware reports another oob interrupt but did not follow a phy up interrupt: oob ready -> phy up -> DEV found -> oob read -> wait phy up -> timeout We run link reset when wait phy up timeout, and it send a normal disk into reset processing. So we made some circumvention action in the code, so that this abnormal oob interrupt will not start the timer to wait for phy up. Link: https://lore.kernel.org/r/1589552025-165012-2-git-send-email-john.garry@huawei.com Signed-off-by: Luo Jiaxing <luojiaxing@huawei.com> Signed-off-by: John Garry <john.garry@huawei.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
-rw-r--r--drivers/scsi/hisi_sas/hisi_sas_main.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c
index 9a6deb21fe4d..11caa4b0d797 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_main.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
@@ -898,8 +898,11 @@ void hisi_sas_phy_oob_ready(struct hisi_hba *hisi_hba, int phy_no)
struct hisi_sas_phy *phy = &hisi_hba->phy[phy_no];
struct device *dev = hisi_hba->dev;
+ dev_dbg(dev, "phy%d OOB ready\n", phy_no);
+ if (phy->phy_attached)
+ return;
+
if (!timer_pending(&phy->timer)) {
- dev_dbg(dev, "phy%d OOB ready\n", phy_no);
phy->timer.expires = jiffies + HISI_SAS_WAIT_PHYUP_TIMEOUT * HZ;
add_timer(&phy->timer);
}