scsi: hisi_sas: Add SATA FIS check for v3 hw
authorXiang Chen <chenxiang66@hisilicon.com>
Wed, 18 Jul 2018 14:14:33 +0000 (22:14 +0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 20 Jul 2018 01:57:40 +0000 (21:57 -0400)
Add a check ERR bit of status to decide whether there is something wrong
with initial register-D2H FIS. If error exist, PHY link reset the channel
to restart OOB.

Directly call work HISI_PHYE_LINK_RESET replacing disable_phy_vx_hw() and
enable_phy_vx_hw().

Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com>
Signed-off-by: John Garry <john.garry@huawei.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c

index 5a3d6a775427493a55e50dbea31b0f110beb15ab..9c5c5a601332ed0e57adc36a7282c3c63fcf3d7f 100644 (file)
@@ -3240,8 +3240,7 @@ static irqreturn_t sata_int_v2_hw(int irq_no, void *p)
        if (fis->status & ATA_ERR) {
                dev_warn(dev, "sata int: phy%d FIS status: 0x%x\n", phy_no,
                                fis->status);
-               disable_phy_v2_hw(hisi_hba, phy_no);
-               enable_phy_v2_hw(hisi_hba, phy_no);
+               hisi_sas_notify_phy_event(phy, HISI_PHYE_LINK_RESET);
                res = IRQ_NONE;
                goto end;
        }
index 70e22993ef058e65b66861cc33417e765b7247a4..08b503e274b818948546e724085c277d27ef3061 100644 (file)
@@ -1191,6 +1191,16 @@ static irqreturn_t phy_up_v3_hw(int phy_no, struct hisi_hba *hisi_hba)
                dev_info(dev, "phyup: phy%d link_rate=%d(sata)\n", phy_no, link_rate);
                initial_fis = &hisi_hba->initial_fis[phy_no];
                fis = &initial_fis->fis;
+
+               /* check ERR bit of Status Register */
+               if (fis->status & ATA_ERR) {
+                       dev_warn(dev, "sata int: phy%d FIS status: 0x%x\n",
+                                phy_no, fis->status);
+                       hisi_sas_notify_phy_event(phy, HISI_PHYE_LINK_RESET);
+                       res = IRQ_NONE;
+                       goto end;
+               }
+
                sas_phy->oob_mode = SATA_OOB_MODE;
                attached_sas_addr[0] = 0x50;
                attached_sas_addr[7] = phy_no;