diff options
Diffstat (limited to 'drivers/scsi/pm8001/pm80xx_hwi.c')
| -rw-r--r-- | drivers/scsi/pm8001/pm80xx_hwi.c | 48 | 
1 files changed, 35 insertions, 13 deletions
diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c index d70587f96184..b06443a0db2d 100644 --- a/drivers/scsi/pm8001/pm80xx_hwi.c +++ b/drivers/scsi/pm8001/pm80xx_hwi.c @@ -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;  } @@ -948,7 +952,7 @@ static int  pm80xx_get_encrypt_info(struct pm8001_hba_info *pm8001_ha)  {  	u32 scratch3_value; -	int ret; +	int ret = -1;  	/* Read encryption status from SCRATCH PAD 3 */  	scratch3_value = pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_3); @@ -982,7 +986,7 @@ pm80xx_get_encrypt_info(struct pm8001_hba_info *pm8001_ha)  		pm8001_ha->encrypt_info.status = 0xFFFFFFFF;  		pm8001_ha->encrypt_info.cipher_mode = 0;  		pm8001_ha->encrypt_info.sec_mode = 0; -		return 0; +		ret = 0;  	} else if ((scratch3_value & SCRATCH_PAD3_ENC_MASK) ==  				SCRATCH_PAD3_ENC_DIS_ERR) {  		pm8001_ha->encrypt_info.status = @@ -1004,7 +1008,6 @@ pm80xx_get_encrypt_info(struct pm8001_hba_info *pm8001_ha)  			scratch3_value, pm8001_ha->encrypt_info.cipher_mode,  			pm8001_ha->encrypt_info.sec_mode,  			pm8001_ha->encrypt_info.status)); -		ret = -1;  	} else if ((scratch3_value & SCRATCH_PAD3_ENC_MASK) ==  				 SCRATCH_PAD3_ENC_ENA_ERR) { @@ -1028,7 +1031,6 @@ pm80xx_get_encrypt_info(struct pm8001_hba_info *pm8001_ha)  			scratch3_value, pm8001_ha->encrypt_info.cipher_mode,  			pm8001_ha->encrypt_info.sec_mode,  			pm8001_ha->encrypt_info.status)); -		ret = -1;  	}  	return ret;  } @@ -1059,6 +1061,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 +1387,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 +1405,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 +1435,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 +1446,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 +1480,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 +3830,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 +4424,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 +4504,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,  | 
