|
@@ -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 @@ out:
|
|
|
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] !=
|