pm8001: honor return value
[firefly-linux-kernel-4.4.55.git] / drivers / scsi / pm8001 / pm80xx_hwi.c
index d70587f961845c2a868f4fd596ef1a624c5d8a30..c711a769d23ed55a4521db82fe6add2765bc6976 100644 (file)
@@ -856,6 +856,8 @@ pm80xx_set_thermal_config(struct pm8001_hba_info *pm8001_ha)
        payload.cfg_pg[1] = (LTEMPHIL << 24) | (RTEMPHIL << 8);
 
        rc = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &payload, 0);
+       if (rc)
+               pm8001_tag_free(pm8001_ha, tag);
        return rc;
 
 }
@@ -936,6 +938,8 @@ pm80xx_set_sas_protocol_timer_config(struct pm8001_hba_info *pm8001_ha)
                         sizeof(SASProtocolTimerConfig_t));
 
        rc = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &payload, 0);
+       if (rc)
+               pm8001_tag_free(pm8001_ha, tag);
 
        return rc;
 }
@@ -1059,6 +1063,8 @@ static int pm80xx_encrypt_update(struct pm8001_hba_info *pm8001_ha)
                                        KEK_MGMT_SUBOP_KEYCARDUPDATE);
 
        rc = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &payload, 0);
+       if (rc)
+               pm8001_tag_free(pm8001_ha, tag);
 
        return rc;
 }
@@ -1383,8 +1389,10 @@ static void pm80xx_send_abort_all(struct pm8001_hba_info *pm8001_ha,
        task->task_done = pm8001_task_done;
 
        res = pm8001_tag_alloc(pm8001_ha, &ccb_tag);
-       if (res)
+       if (res) {
+               sas_free_task(task);
                return;
+       }
 
        ccb = &pm8001_ha->ccb_info[ccb_tag];
        ccb->device = pm8001_ha_dev;
@@ -1399,7 +1407,10 @@ static void pm80xx_send_abort_all(struct pm8001_hba_info *pm8001_ha,
        task_abort.tag = cpu_to_le32(ccb_tag);
 
        ret = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &task_abort, 0);
-
+       if (ret) {
+               sas_free_task(task);
+               pm8001_tag_free(pm8001_ha, ccb_tag);
+       }
 }
 
 static void pm80xx_send_read_log(struct pm8001_hba_info *pm8001_ha,
@@ -1426,6 +1437,7 @@ static void pm80xx_send_read_log(struct pm8001_hba_info *pm8001_ha,
 
        res = pm8001_tag_alloc(pm8001_ha, &ccb_tag);
        if (res) {
+               sas_free_task(task);
                PM8001_FAIL_DBG(pm8001_ha,
                        pm8001_printk("cannot allocate tag !!!\n"));
                return;
@@ -1436,15 +1448,16 @@ static void pm80xx_send_read_log(struct pm8001_hba_info *pm8001_ha,
        */
        dev = kzalloc(sizeof(struct domain_device), GFP_ATOMIC);
        if (!dev) {
+               sas_free_task(task);
+               pm8001_tag_free(pm8001_ha, ccb_tag);
                PM8001_FAIL_DBG(pm8001_ha,
                        pm8001_printk("Domain device cannot be allocated\n"));
-               sas_free_task(task);
                return;
-       } else {
-               task->dev = dev;
-               task->dev->lldd_dev = pm8001_ha_dev;
        }
 
+       task->dev = dev;
+       task->dev->lldd_dev = pm8001_ha_dev;
+
        ccb = &pm8001_ha->ccb_info[ccb_tag];
        ccb->device = pm8001_ha_dev;
        ccb->ccb_tag = ccb_tag;
@@ -1469,7 +1482,11 @@ static void pm80xx_send_read_log(struct pm8001_hba_info *pm8001_ha,
        memcpy(&sata_cmd.sata_fis, &fis, sizeof(struct host_to_dev_fis));
 
        res = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &sata_cmd, 0);
-
+       if (res) {
+               sas_free_task(task);
+               pm8001_tag_free(pm8001_ha, ccb_tag);
+               kfree(dev);
+       }
 }
 
 /**
@@ -3815,7 +3832,10 @@ static int pm80xx_chip_smp_req(struct pm8001_hba_info *pm8001_ha,
 
        build_smp_cmd(pm8001_dev->device_id, smp_cmd.tag,
                                &smp_cmd, pm8001_ha->smp_exp_mode, length);
-       pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, (u32 *)&smp_cmd, 0);
+       rc = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc,
+                                       (u32 *)&smp_cmd, 0);
+       if (rc)
+               goto err_out_2;
        return 0;
 
 err_out_2:
@@ -4406,6 +4426,8 @@ static int pm80xx_chip_reg_dev_req(struct pm8001_hba_info *pm8001_ha,
                SAS_ADDR_SIZE);
 
        rc = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &payload, 0);
+       if (rc)
+               pm8001_tag_free(pm8001_ha, tag);
 
        return rc;
 }
@@ -4484,7 +4506,9 @@ void mpi_set_phy_profile_req(struct pm8001_hba_info *pm8001_ha,
                payload.reserved[j] =  cpu_to_le32(*((u32 *)buf + i));
                j++;
        }
-       pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &payload, 0);
+       rc = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &payload, 0);
+       if (rc)
+               pm8001_tag_free(pm8001_ha, tag);
 }
 
 void pm8001_set_phy_profile(struct pm8001_hba_info *pm8001_ha,