aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/pm8001/pm80xx_hwi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/pm8001/pm80xx_hwi.c')
-rw-r--r--drivers/scsi/pm8001/pm80xx_hwi.c48
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)
856 payload.cfg_pg[1] = (LTEMPHIL << 24) | (RTEMPHIL << 8); 856 payload.cfg_pg[1] = (LTEMPHIL << 24) | (RTEMPHIL << 8);
857 857
858 rc = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &payload, 0); 858 rc = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &payload, 0);
859 if (rc)
860 pm8001_tag_free(pm8001_ha, tag);
859 return rc; 861 return rc;
860 862
861} 863}
@@ -936,6 +938,8 @@ pm80xx_set_sas_protocol_timer_config(struct pm8001_hba_info *pm8001_ha)
936 sizeof(SASProtocolTimerConfig_t)); 938 sizeof(SASProtocolTimerConfig_t));
937 939
938 rc = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &payload, 0); 940 rc = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &payload, 0);
941 if (rc)
942 pm8001_tag_free(pm8001_ha, tag);
939 943
940 return rc; 944 return rc;
941} 945}
@@ -948,7 +952,7 @@ static int
948pm80xx_get_encrypt_info(struct pm8001_hba_info *pm8001_ha) 952pm80xx_get_encrypt_info(struct pm8001_hba_info *pm8001_ha)
949{ 953{
950 u32 scratch3_value; 954 u32 scratch3_value;
951 int ret; 955 int ret = -1;
952 956
953 /* Read encryption status from SCRATCH PAD 3 */ 957 /* Read encryption status from SCRATCH PAD 3 */
954 scratch3_value = pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_3); 958 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)
982 pm8001_ha->encrypt_info.status = 0xFFFFFFFF; 986 pm8001_ha->encrypt_info.status = 0xFFFFFFFF;
983 pm8001_ha->encrypt_info.cipher_mode = 0; 987 pm8001_ha->encrypt_info.cipher_mode = 0;
984 pm8001_ha->encrypt_info.sec_mode = 0; 988 pm8001_ha->encrypt_info.sec_mode = 0;
985 return 0; 989 ret = 0;
986 } else if ((scratch3_value & SCRATCH_PAD3_ENC_MASK) == 990 } else if ((scratch3_value & SCRATCH_PAD3_ENC_MASK) ==
987 SCRATCH_PAD3_ENC_DIS_ERR) { 991 SCRATCH_PAD3_ENC_DIS_ERR) {
988 pm8001_ha->encrypt_info.status = 992 pm8001_ha->encrypt_info.status =
@@ -1004,7 +1008,6 @@ pm80xx_get_encrypt_info(struct pm8001_hba_info *pm8001_ha)
1004 scratch3_value, pm8001_ha->encrypt_info.cipher_mode, 1008 scratch3_value, pm8001_ha->encrypt_info.cipher_mode,
1005 pm8001_ha->encrypt_info.sec_mode, 1009 pm8001_ha->encrypt_info.sec_mode,
1006 pm8001_ha->encrypt_info.status)); 1010 pm8001_ha->encrypt_info.status));
1007 ret = -1;
1008 } else if ((scratch3_value & SCRATCH_PAD3_ENC_MASK) == 1011 } else if ((scratch3_value & SCRATCH_PAD3_ENC_MASK) ==
1009 SCRATCH_PAD3_ENC_ENA_ERR) { 1012 SCRATCH_PAD3_ENC_ENA_ERR) {
1010 1013
@@ -1028,7 +1031,6 @@ pm80xx_get_encrypt_info(struct pm8001_hba_info *pm8001_ha)
1028 scratch3_value, pm8001_ha->encrypt_info.cipher_mode, 1031 scratch3_value, pm8001_ha->encrypt_info.cipher_mode,
1029 pm8001_ha->encrypt_info.sec_mode, 1032 pm8001_ha->encrypt_info.sec_mode,
1030 pm8001_ha->encrypt_info.status)); 1033 pm8001_ha->encrypt_info.status));
1031 ret = -1;
1032 } 1034 }
1033 return ret; 1035 return ret;
1034} 1036}
@@ -1059,6 +1061,8 @@ static int pm80xx_encrypt_update(struct pm8001_hba_info *pm8001_ha)
1059 KEK_MGMT_SUBOP_KEYCARDUPDATE); 1061 KEK_MGMT_SUBOP_KEYCARDUPDATE);
1060 1062
1061 rc = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &payload, 0); 1063 rc = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &payload, 0);
1064 if (rc)
1065 pm8001_tag_free(pm8001_ha, tag);
1062 1066
1063 return rc; 1067 return rc;
1064} 1068}
@@ -1383,8 +1387,10 @@ static void pm80xx_send_abort_all(struct pm8001_hba_info *pm8001_ha,
1383 task->task_done = pm8001_task_done; 1387 task->task_done = pm8001_task_done;
1384 1388
1385 res = pm8001_tag_alloc(pm8001_ha, &ccb_tag); 1389 res = pm8001_tag_alloc(pm8001_ha, &ccb_tag);
1386 if (res) 1390 if (res) {
1391 sas_free_task(task);
1387 return; 1392 return;
1393 }
1388 1394
1389 ccb = &pm8001_ha->ccb_info[ccb_tag]; 1395 ccb = &pm8001_ha->ccb_info[ccb_tag];
1390 ccb->device = pm8001_ha_dev; 1396 ccb->device = pm8001_ha_dev;
@@ -1399,7 +1405,10 @@ static void pm80xx_send_abort_all(struct pm8001_hba_info *pm8001_ha,
1399 task_abort.tag = cpu_to_le32(ccb_tag); 1405 task_abort.tag = cpu_to_le32(ccb_tag);
1400 1406
1401 ret = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &task_abort, 0); 1407 ret = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &task_abort, 0);
1402 1408 if (ret) {
1409 sas_free_task(task);
1410 pm8001_tag_free(pm8001_ha, ccb_tag);
1411 }
1403} 1412}
1404 1413
1405static void pm80xx_send_read_log(struct pm8001_hba_info *pm8001_ha, 1414static 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,
1426 1435
1427 res = pm8001_tag_alloc(pm8001_ha, &ccb_tag); 1436 res = pm8001_tag_alloc(pm8001_ha, &ccb_tag);
1428 if (res) { 1437 if (res) {
1438 sas_free_task(task);
1429 PM8001_FAIL_DBG(pm8001_ha, 1439 PM8001_FAIL_DBG(pm8001_ha,
1430 pm8001_printk("cannot allocate tag !!!\n")); 1440 pm8001_printk("cannot allocate tag !!!\n"));
1431 return; 1441 return;
@@ -1436,15 +1446,16 @@ static void pm80xx_send_read_log(struct pm8001_hba_info *pm8001_ha,
1436 */ 1446 */
1437 dev = kzalloc(sizeof(struct domain_device), GFP_ATOMIC); 1447 dev = kzalloc(sizeof(struct domain_device), GFP_ATOMIC);
1438 if (!dev) { 1448 if (!dev) {
1449 sas_free_task(task);
1450 pm8001_tag_free(pm8001_ha, ccb_tag);
1439 PM8001_FAIL_DBG(pm8001_ha, 1451 PM8001_FAIL_DBG(pm8001_ha,
1440 pm8001_printk("Domain device cannot be allocated\n")); 1452 pm8001_printk("Domain device cannot be allocated\n"));
1441 sas_free_task(task);
1442 return; 1453 return;
1443 } else {
1444 task->dev = dev;
1445 task->dev->lldd_dev = pm8001_ha_dev;
1446 } 1454 }
1447 1455
1456 task->dev = dev;
1457 task->dev->lldd_dev = pm8001_ha_dev;
1458
1448 ccb = &pm8001_ha->ccb_info[ccb_tag]; 1459 ccb = &pm8001_ha->ccb_info[ccb_tag];
1449 ccb->device = pm8001_ha_dev; 1460 ccb->device = pm8001_ha_dev;
1450 ccb->ccb_tag = ccb_tag; 1461 ccb->ccb_tag = ccb_tag;
@@ -1469,7 +1480,11 @@ static void pm80xx_send_read_log(struct pm8001_hba_info *pm8001_ha,
1469 memcpy(&sata_cmd.sata_fis, &fis, sizeof(struct host_to_dev_fis)); 1480 memcpy(&sata_cmd.sata_fis, &fis, sizeof(struct host_to_dev_fis));
1470 1481
1471 res = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &sata_cmd, 0); 1482 res = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &sata_cmd, 0);
1472 1483 if (res) {
1484 sas_free_task(task);
1485 pm8001_tag_free(pm8001_ha, ccb_tag);
1486 kfree(dev);
1487 }
1473} 1488}
1474 1489
1475/** 1490/**
@@ -3815,7 +3830,10 @@ static int pm80xx_chip_smp_req(struct pm8001_hba_info *pm8001_ha,
3815 3830
3816 build_smp_cmd(pm8001_dev->device_id, smp_cmd.tag, 3831 build_smp_cmd(pm8001_dev->device_id, smp_cmd.tag,
3817 &smp_cmd, pm8001_ha->smp_exp_mode, length); 3832 &smp_cmd, pm8001_ha->smp_exp_mode, length);
3818 pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, (u32 *)&smp_cmd, 0); 3833 rc = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc,
3834 (u32 *)&smp_cmd, 0);
3835 if (rc)
3836 goto err_out_2;
3819 return 0; 3837 return 0;
3820 3838
3821err_out_2: 3839err_out_2:
@@ -4406,6 +4424,8 @@ static int pm80xx_chip_reg_dev_req(struct pm8001_hba_info *pm8001_ha,
4406 SAS_ADDR_SIZE); 4424 SAS_ADDR_SIZE);
4407 4425
4408 rc = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &payload, 0); 4426 rc = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &payload, 0);
4427 if (rc)
4428 pm8001_tag_free(pm8001_ha, tag);
4409 4429
4410 return rc; 4430 return rc;
4411} 4431}
@@ -4484,7 +4504,9 @@ void mpi_set_phy_profile_req(struct pm8001_hba_info *pm8001_ha,
4484 payload.reserved[j] = cpu_to_le32(*((u32 *)buf + i)); 4504 payload.reserved[j] = cpu_to_le32(*((u32 *)buf + i));
4485 j++; 4505 j++;
4486 } 4506 }
4487 pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &payload, 0); 4507 rc = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &payload, 0);
4508 if (rc)
4509 pm8001_tag_free(pm8001_ha, tag);
4488} 4510}
4489 4511
4490void pm8001_set_phy_profile(struct pm8001_hba_info *pm8001_ha, 4512void pm8001_set_phy_profile(struct pm8001_hba_info *pm8001_ha,