Re: [PATCH 1/4] scsi: ufs: Fix broken task management command implementation

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Jul 3, 2013 at 9:22 PM, Sujit Reddy Thumma
<sthumma@xxxxxxxxxxxxxx> wrote:
> On 7/2/2013 9:21 PM, Santosh Y wrote:
>>
>> On Fri, Jun 28, 2013 at 5:02 PM, Sujit Reddy Thumma
>> <sthumma@xxxxxxxxxxxxxx> wrote:
>>>
>>> On 6/27/2013 4:49 PM, Santosh Y wrote:
>>>>>
>>>>>
>>>>>> +       spin_lock_irqsave(host->host_lock, flags);
>>>>>>          task_req_descp = hba->utmrdl_base_addr;
>>>>>>          task_req_descp += free_slot;
>>>>>>
>>>>>> @@ -2353,38 +2387,39 @@ ufshcd_issue_tm_cmd(struct ufs_hba *hba,
>>>>>>                  (struct utp_upiu_task_req *)
>>>>>> task_req_descp->task_req_upiu;
>>>>>>          task_req_upiup->header.dword_0 =
>>>>>>                  UPIU_HEADER_DWORD(UPIU_TRANSACTION_TASK_REQ, 0,
>>>>>> -                                             lrbp->lun,
>>>>>> lrbp->task_tag);
>>>>>> +                               lun_id, free_slot);
>>>>
>>>>
>>>> Actually it still doesn't fix the problem. The*task tag*  used here
>>>>
>>>> should be unique across the SCSI/Query and Task Managment UPIUs.
>>>
>>>
>>>
>>> I am sorry, I didn't get that. Why should it be unique across the
>>> SCSI/Query? For example, if a machine supports 32 request slots and 8
>>> task
>>> management slots, then the task management command tag can be anything
>>> out
>>> of 8 slots.
>>>
>>
>> The spec(ufs 1.1) has the requirement under  '10.5.2 Basic Header
>> Format'->'Task Tag'.
>> Couple of devices I came across had similar behavior. The tracking of
>> UPIUs --even belonging to a separate group-- seemed to be based on the
>> 'task tag' value rather than 'type of UPIU'->'task tag'.
>
>
> Thanks for the clarification. So to make the task tag unique we should do
> something like below:
>
> @@ -2940,9 +2941,10 @@ static int ufshcd_issue_tm_cmd(struct ufs_hba *hba,
> int lun_id, int task_id,
>         /* Configure task request UPIU */
>         task_req_upiup =
>
>                 (struct utp_upiu_task_req *) task_req_descp->task_req_upiu;
> +       task_tag = hba->nutrs + free_slot;

Yes, this was exactly my internal fix at the time :-)

>
>         task_req_upiup->header.dword_0 =
>                 UPIU_HEADER_DWORD(UPIU_TRANSACTION_TASK_REQ, 0,
> -                               lun_id, free_slot);
> +                               lun_id, task_tag);
>
> Will this work for the devices you came across?
>
>
> --
> Regards,
> Sujit



-- 
~Santosh
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux