]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
scsi: hisi_sas: Do not reset phy timer to wait for stray phy up
authorLuo Jiaxing <luojiaxing@huawei.com>
Fri, 15 May 2020 14:13:42 +0000 (22:13 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 24 Jun 2020 15:50:15 +0000 (17:50 +0200)
[ 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>
drivers/scsi/hisi_sas/hisi_sas_main.c

index 6f4692f0d7143974378af0880ad764bfb069dbcf..031aa4043c5ea31774ccd704aac5378c06308473 100644 (file)
@@ -904,8 +904,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);
        }