struct asd_sas_phy *sas_phy = &phy->sas_phy;
        int phy_no = sas_phy->id;
 
+       phy->wait_phyup_cnt = 0;
        if (phy->identify.target_port_protocols == SAS_PROTOCOL_SSP)
                hisi_hba->hw->sl_notify_ssp(hisi_hba, phy_no);
        hisi_sas_bytes_dmaed(hisi_hba, phy_no, GFP_KERNEL);
        hisi_sas_notify_phy_event(phy, HISI_PHYE_LINK_RESET);
 }
 
+#define HISI_SAS_WAIT_PHYUP_RETRIES    10
+
 void hisi_sas_phy_oob_ready(struct hisi_hba *hisi_hba, int phy_no)
 {
        struct hisi_sas_phy *phy = &hisi_hba->phy[phy_no];
                return;
 
        if (!timer_pending(&phy->timer)) {
-               phy->timer.expires = jiffies + HISI_SAS_WAIT_PHYUP_TIMEOUT * HZ;
-               add_timer(&phy->timer);
+               if (phy->wait_phyup_cnt < HISI_SAS_WAIT_PHYUP_RETRIES) {
+                       phy->wait_phyup_cnt++;
+                       phy->timer.expires = jiffies +
+                                            HISI_SAS_WAIT_PHYUP_TIMEOUT * HZ;
+                       add_timer(&phy->timer);
+               } else {
+                       dev_warn(dev, "phy%d failed to come up %d times, giving up\n",
+                                phy_no, phy->wait_phyup_cnt);
+                       phy->wait_phyup_cnt = 0;
+               }
        }
 }
 EXPORT_SYMBOL_GPL(hisi_sas_phy_oob_ready);