diff options
author | Anand Kumar Santhanam <AnandKumar.Santhanam@pmcs.com> | 2013-09-17 07:28:10 -0400 |
---|---|---|
committer | James Bottomley <JBottomley@Parallels.com> | 2013-10-25 04:58:14 -0400 |
commit | e912457bb8a2fc56e7036c5837e2947b430e93e1 (patch) | |
tree | c2169c77edea154a90c9fb54d31b0f0f53f056d9 /drivers/scsi/pm8001 | |
parent | 966fdcff8eb78cce81da8f5adc5b7fe601b53d18 (diff) |
[SCSI] pm80xx: Set device state response logic fix.
Signed-off-by: Anandkumar.Santhanam@pmcs.com
Reviewed-by: Jack Wang <jinpu.wang@profitbricks.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi/pm8001')
-rw-r--r-- | drivers/scsi/pm8001/pm8001_hwi.c | 6 | ||||
-rw-r--r-- | drivers/scsi/pm8001/pm8001_sas.c | 9 |
2 files changed, 12 insertions, 3 deletions
diff --git a/drivers/scsi/pm8001/pm8001_hwi.c b/drivers/scsi/pm8001/pm8001_hwi.c index 4a2195752198..4c9c220d1726 100644 --- a/drivers/scsi/pm8001/pm8001_hwi.c +++ b/drivers/scsi/pm8001/pm8001_hwi.c | |||
@@ -3087,8 +3087,8 @@ void pm8001_mpi_set_dev_state_resp(struct pm8001_hba_info *pm8001_ha, | |||
3087 | struct pm8001_device *pm8001_dev = ccb->device; | 3087 | struct pm8001_device *pm8001_dev = ccb->device; |
3088 | u32 status = le32_to_cpu(pPayload->status); | 3088 | u32 status = le32_to_cpu(pPayload->status); |
3089 | u32 device_id = le32_to_cpu(pPayload->device_id); | 3089 | u32 device_id = le32_to_cpu(pPayload->device_id); |
3090 | u8 pds = le32_to_cpu(pPayload->pds_nds) | PDS_BITS; | 3090 | u8 pds = le32_to_cpu(pPayload->pds_nds) & PDS_BITS; |
3091 | u8 nds = le32_to_cpu(pPayload->pds_nds) | NDS_BITS; | 3091 | u8 nds = le32_to_cpu(pPayload->pds_nds) & NDS_BITS; |
3092 | PM8001_MSG_DBG(pm8001_ha, pm8001_printk("Set device id = 0x%x state " | 3092 | PM8001_MSG_DBG(pm8001_ha, pm8001_printk("Set device id = 0x%x state " |
3093 | "from 0x%x to 0x%x status = 0x%x!\n", | 3093 | "from 0x%x to 0x%x status = 0x%x!\n", |
3094 | device_id, pds, nds, status)); | 3094 | device_id, pds, nds, status)); |
@@ -4700,6 +4700,8 @@ int pm8001_chip_ssp_tm_req(struct pm8001_hba_info *pm8001_ha, | |||
4700 | sspTMCmd.tmf = cpu_to_le32(tmf->tmf); | 4700 | sspTMCmd.tmf = cpu_to_le32(tmf->tmf); |
4701 | memcpy(sspTMCmd.lun, task->ssp_task.LUN, 8); | 4701 | memcpy(sspTMCmd.lun, task->ssp_task.LUN, 8); |
4702 | sspTMCmd.tag = cpu_to_le32(ccb->ccb_tag); | 4702 | sspTMCmd.tag = cpu_to_le32(ccb->ccb_tag); |
4703 | if (pm8001_ha->chip_id != chip_8001) | ||
4704 | sspTMCmd.ds_ads_m = 0x08; | ||
4703 | circularQ = &pm8001_ha->inbnd_q_tbl[0]; | 4705 | circularQ = &pm8001_ha->inbnd_q_tbl[0]; |
4704 | ret = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &sspTMCmd, 0); | 4706 | ret = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &sspTMCmd, 0); |
4705 | return ret; | 4707 | return ret; |
diff --git a/drivers/scsi/pm8001/pm8001_sas.c b/drivers/scsi/pm8001/pm8001_sas.c index a85d73de7c80..f4eb18e51631 100644 --- a/drivers/scsi/pm8001/pm8001_sas.c +++ b/drivers/scsi/pm8001/pm8001_sas.c | |||
@@ -447,7 +447,6 @@ static int pm8001_task_exec(struct sas_task *task, const int num, | |||
447 | break; | 447 | break; |
448 | case SAS_PROTOCOL_SATA: | 448 | case SAS_PROTOCOL_SATA: |
449 | case SAS_PROTOCOL_STP: | 449 | case SAS_PROTOCOL_STP: |
450 | case SAS_PROTOCOL_SATA | SAS_PROTOCOL_STP: | ||
451 | rc = pm8001_task_prep_ata(pm8001_ha, ccb); | 450 | rc = pm8001_task_prep_ata(pm8001_ha, ccb); |
452 | break; | 451 | break; |
453 | default: | 452 | default: |
@@ -704,6 +703,8 @@ static int pm8001_exec_internal_tmf_task(struct domain_device *dev, | |||
704 | int res, retry; | 703 | int res, retry; |
705 | struct sas_task *task = NULL; | 704 | struct sas_task *task = NULL; |
706 | struct pm8001_hba_info *pm8001_ha = pm8001_find_ha_by_dev(dev); | 705 | struct pm8001_hba_info *pm8001_ha = pm8001_find_ha_by_dev(dev); |
706 | struct pm8001_device *pm8001_dev = dev->lldd_dev; | ||
707 | DECLARE_COMPLETION_ONSTACK(completion_setstate); | ||
707 | 708 | ||
708 | for (retry = 0; retry < 3; retry++) { | 709 | for (retry = 0; retry < 3; retry++) { |
709 | task = sas_alloc_slow_task(GFP_KERNEL); | 710 | task = sas_alloc_slow_task(GFP_KERNEL); |
@@ -729,6 +730,12 @@ static int pm8001_exec_internal_tmf_task(struct domain_device *dev, | |||
729 | goto ex_err; | 730 | goto ex_err; |
730 | } | 731 | } |
731 | wait_for_completion(&task->slow_task->completion); | 732 | wait_for_completion(&task->slow_task->completion); |
733 | if (pm8001_ha->chip_id != chip_8001) { | ||
734 | pm8001_dev->setds_completion = &completion_setstate; | ||
735 | PM8001_CHIP_DISP->set_dev_state_req(pm8001_ha, | ||
736 | pm8001_dev, 0x01); | ||
737 | wait_for_completion(&completion_setstate); | ||
738 | } | ||
732 | res = -TMF_RESP_FUNC_FAILED; | 739 | res = -TMF_RESP_FUNC_FAILED; |
733 | /* Even TMF timed out, return direct. */ | 740 | /* Even TMF timed out, return direct. */ |
734 | if ((task->task_state_flags & SAS_TASK_STATE_ABORTED)) { | 741 | if ((task->task_state_flags & SAS_TASK_STATE_ABORTED)) { |