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) | |||
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 | |||
948 | pm80xx_get_encrypt_info(struct pm8001_hba_info *pm8001_ha) | 952 | pm80xx_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 | ||
1405 | static void pm80xx_send_read_log(struct pm8001_hba_info *pm8001_ha, | 1414 | 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, | |||
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 | ||
3821 | err_out_2: | 3839 | err_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 | ||
4490 | void pm8001_set_phy_profile(struct pm8001_hba_info *pm8001_ha, | 4512 | void pm8001_set_phy_profile(struct pm8001_hba_info *pm8001_ha, |