Re: [PATCH][SCSI] scsi: ufs: get a TM service response from the correct offset
Hi Kiwoong Kim, This is a good catch, Looks good to me. Reviewed-by: Subhash JadavaniThanks, Subhash On 2016-09-08 16:22, Kiwoong Kim wrote: From: Kiwoong Kim When any UFS host controller receives a TM(Task Management) response from a UFS device, UFS driver has been recognize like receiving a message of "Task Management Function Complete"(00h) in all cases, so far. That means there is no pending task for a tag of the TM request sent before in the UFS device. That's because the byte offset 6 in TM response which has been used to get a TM service response so far represents just whether or not a TM transmission passes. Regarding UFS spec, the correct byte offset to get TM service response is 15, not 6. I tested that UFS driver responds properly for the TM response From a UFS device with an reference board with exynos8890, as follow: No pending task -> Task Management Function Complete (00h) Pending task -> Task Management Function Succeeded (08h) Signed-off-by: Kiwoong Kim Signed-off-by: HeonGwang Chu Tested-by: : Kiwoong Kim --- drivers/scsi/ufs/ufs.h|1 + drivers/scsi/ufs/ufshcd.c |4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/scsi/ufs/ufs.h b/drivers/scsi/ufs/ufs.h index 42c459a..89c121e 100644 --- a/drivers/scsi/ufs/ufs.h +++ b/drivers/scsi/ufs/ufs.h @@ -295,6 +295,7 @@ enum { MASK_QUERY_DATA_SEG_LEN = 0x, MASK_RSP_UPIU_DATA_SEG_LEN = 0x, MASK_RSP_EXCEPTION_EVENT= 0x1, + MASK_TM_SERVICE_RESP= 0xFF, }; /* Task management service response */ diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index e8a706b..c641cd3 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -3013,8 +3013,8 @@ static int ufshcd_task_req_compl(struct ufs_hba *hba, u32 index, u8 *resp) if (ocs_value == OCS_SUCCESS) { task_rsp_upiup = (struct utp_upiu_task_rsp *) task_req_descp[index].task_rsp_upiu; - task_result = be32_to_cpu(task_rsp_upiup->header.dword_1); - task_result = ((task_result & MASK_TASK_RESPONSE) >> 8); + task_result = be32_to_cpu(task_rsp_upiup->output_param1); + task_result = task_result & MASK_TM_SERVICE_RESP; if (resp) *resp = (u8)task_result; } else { -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH][SCSI] scsi: ufs: get a TM service response from the correct offset
> "Kiwoong" == Kiwoong Kimwrites: Kiwoong, Kiwoong> When any UFS host controller receives a TM(Task Management) Kiwoong> response from a UFS device, UFS driver has been recognize like Kiwoong> receiving a message of "Task Management Function Complete"(00h) Kiwoong> in all cases, so far. That means there is no pending task for Kiwoong> a tag of the TM request sent before in the UFS device. That's Kiwoong> because the byte offset 6 in TM response which has been used to Kiwoong> get a TM service response so far represents just whether or not Kiwoong> a TM transmission passes. Kiwoong> Regarding UFS spec, the correct byte offset to get TM service Kiwoong> response is 15, not 6. Kiwoong> I tested that UFS driver responds properly for the TM response Kiwoong> From a UFS device with an reference board with exynos8890, as Kiwoong> follow: No pending task -> Task Management Function Complete Kiwoong> (00h) Pending task -> Task Management Function Succeeded (08h) Went through the hoops to verify this in the spec since nobody stepped up to review. In the future please make sure to submit patches against my scsi for-next git repo. I had to apply the patch by hand. Thanks! -- Martin K. Petersen Oracle Linux Engineering -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH][SCSI] scsi: ufs: get a TM service response from the correct offset
From: Kiwoong KimWhen any UFS host controller receives a TM(Task Management) response from a UFS device, UFS driver has been recognize like receiving a message of "Task Management Function Complete"(00h) in all cases, so far. That means there is no pending task for a tag of the TM request sent before in the UFS device. That's because the byte offset 6 in TM response which has been used to get a TM service response so far represents just whether or not a TM transmission passes. Regarding UFS spec, the correct byte offset to get TM service response is 15, not 6. I tested that UFS driver responds properly for the TM response >From a UFS device with an reference board with exynos8890, as follow: No pending task -> Task Management Function Complete (00h) Pending task -> Task Management Function Succeeded (08h) Signed-off-by: Kiwoong Kim Signed-off-by: HeonGwang Chu Tested-by: : Kiwoong Kim --- drivers/scsi/ufs/ufs.h|1 + drivers/scsi/ufs/ufshcd.c |4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/scsi/ufs/ufs.h b/drivers/scsi/ufs/ufs.h index 42c459a..89c121e 100644 --- a/drivers/scsi/ufs/ufs.h +++ b/drivers/scsi/ufs/ufs.h @@ -295,6 +295,7 @@ enum { MASK_QUERY_DATA_SEG_LEN = 0x, MASK_RSP_UPIU_DATA_SEG_LEN = 0x, MASK_RSP_EXCEPTION_EVENT= 0x1, + MASK_TM_SERVICE_RESP= 0xFF, }; /* Task management service response */ diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index e8a706b..c641cd3 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -3013,8 +3013,8 @@ static int ufshcd_task_req_compl(struct ufs_hba *hba, u32 index, u8 *resp) if (ocs_value == OCS_SUCCESS) { task_rsp_upiup = (struct utp_upiu_task_rsp *) task_req_descp[index].task_rsp_upiu; - task_result = be32_to_cpu(task_rsp_upiup->header.dword_1); - task_result = ((task_result & MASK_TASK_RESPONSE) >> 8); + task_result = be32_to_cpu(task_rsp_upiup->output_param1); + task_result = task_result & MASK_TM_SERVICE_RESP; if (resp) *resp = (u8)task_result; } else { -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html