mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-06 02:50:43 +00:00
scsi: ufs: add retry for query descriptors
Query commands have 100ms timeout and it may timeout if they are issued in parallel to ongoing read/write SCSI commands, this change adds the retry (max: 10) in case command timeouts. Reviewed-by: Hannes Reinecke <hare@suse.de> Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org> Signed-off-by: Yaniv Gardi <ygardi@codeaurora.org> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
583fa62d08
commit
a70e91b8bb
1 changed files with 37 additions and 18 deletions
|
@ -1875,21 +1875,7 @@ static int ufshcd_query_attr_retry(struct ufs_hba *hba,
|
|||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* ufshcd_query_descriptor - API function for sending descriptor requests
|
||||
* hba: per-adapter instance
|
||||
* opcode: attribute opcode
|
||||
* idn: attribute idn to access
|
||||
* index: index field
|
||||
* selector: selector field
|
||||
* desc_buf: the buffer that contains the descriptor
|
||||
* buf_len: length parameter passed to the device
|
||||
*
|
||||
* Returns 0 for success, non-zero in case of failure.
|
||||
* The buf_len parameter will contain, on return, the length parameter
|
||||
* received on the response.
|
||||
*/
|
||||
static int ufshcd_query_descriptor(struct ufs_hba *hba,
|
||||
static int __ufshcd_query_descriptor(struct ufs_hba *hba,
|
||||
enum query_opcode opcode, enum desc_idn idn, u8 index,
|
||||
u8 selector, u8 *desc_buf, int *buf_len)
|
||||
{
|
||||
|
@ -1953,6 +1939,39 @@ static int ufshcd_query_descriptor(struct ufs_hba *hba,
|
|||
return err;
|
||||
}
|
||||
|
||||
/**
|
||||
* ufshcd_query_descriptor_retry - API function for sending descriptor
|
||||
* requests
|
||||
* hba: per-adapter instance
|
||||
* opcode: attribute opcode
|
||||
* idn: attribute idn to access
|
||||
* index: index field
|
||||
* selector: selector field
|
||||
* desc_buf: the buffer that contains the descriptor
|
||||
* buf_len: length parameter passed to the device
|
||||
*
|
||||
* Returns 0 for success, non-zero in case of failure.
|
||||
* The buf_len parameter will contain, on return, the length parameter
|
||||
* received on the response.
|
||||
*/
|
||||
int ufshcd_query_descriptor_retry(struct ufs_hba *hba,
|
||||
enum query_opcode opcode, enum desc_idn idn, u8 index,
|
||||
u8 selector, u8 *desc_buf, int *buf_len)
|
||||
{
|
||||
int err;
|
||||
int retries;
|
||||
|
||||
for (retries = QUERY_REQ_RETRIES; retries > 0; retries--) {
|
||||
err = __ufshcd_query_descriptor(hba, opcode, idn, index,
|
||||
selector, desc_buf, buf_len);
|
||||
if (!err || err == -EINVAL)
|
||||
break;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(ufshcd_query_descriptor_retry);
|
||||
|
||||
/**
|
||||
* ufshcd_read_desc_param - read the specified descriptor parameter
|
||||
* @hba: Pointer to adapter instance
|
||||
|
@ -1995,9 +2014,9 @@ static int ufshcd_read_desc_param(struct ufs_hba *hba,
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ret = ufshcd_query_descriptor(hba, UPIU_QUERY_OPCODE_READ_DESC,
|
||||
desc_id, desc_index, 0, desc_buf,
|
||||
&buff_len);
|
||||
ret = ufshcd_query_descriptor_retry(hba, UPIU_QUERY_OPCODE_READ_DESC,
|
||||
desc_id, desc_index, 0, desc_buf,
|
||||
&buff_len);
|
||||
|
||||
if (ret || (buff_len < ufs_query_desc_max_size[desc_id]) ||
|
||||
(desc_buf[QUERY_DESC_LENGTH_OFFSET] !=
|
||||
|
|
Loading…
Reference in a new issue