return hisi_sas_task_exec(task, gfp_flags, 0, NULL);
 }
 
-static void hisi_sas_phy_set_linkrate(struct hisi_hba *hisi_hba, int phy_no,
+static int hisi_sas_phy_set_linkrate(struct hisi_hba *hisi_hba, int phy_no,
                        struct sas_phy_linkrates *r)
 {
        struct sas_phy_linkrates _r;
        struct asd_sas_phy *sas_phy = &phy->sas_phy;
        enum sas_linkrate min, max;
 
+       if (r->minimum_linkrate > SAS_LINK_RATE_1_5_GBPS)
+               return -EINVAL;
+
        if (r->maximum_linkrate == SAS_LINK_RATE_UNKNOWN) {
                max = sas_phy->phy->maximum_linkrate;
                min = r->minimum_linkrate;
                max = r->maximum_linkrate;
                min = sas_phy->phy->minimum_linkrate;
        } else
-               return;
+               return -EINVAL;
 
        _r.maximum_linkrate = max;
        _r.minimum_linkrate = min;
        msleep(100);
        hisi_hba->hw->phy_set_linkrate(hisi_hba, phy_no, &_r);
        hisi_hba->hw->phy_start(hisi_hba, phy_no);
+
+       return 0;
 }
 
 static int hisi_sas_control_phy(struct asd_sas_phy *sas_phy, enum phy_func func,
                break;
 
        case PHY_FUNC_SET_LINK_RATE:
-               hisi_sas_phy_set_linkrate(hisi_hba, phy_no, funcdata);
-               break;
+               return hisi_sas_phy_set_linkrate(hisi_hba, phy_no, funcdata);
        case PHY_FUNC_GET_EVENTS:
                if (hisi_hba->hw->get_events) {
                        hisi_hba->hw->get_events(hisi_hba, phy_no);