@@ -63,7 +63,11 @@ enum {
63
63
/* Query request retries */
64
64
#define QUERY_REQ_RETRIES 3
65
65
/* Query request timeout */
66
- #define QUERY_REQ_TIMEOUT 1500 /* 1.5 seconds */
66
+ enum {
67
+ QUERY_REQ_TIMEOUT_MIN = 1 ,
68
+ QUERY_REQ_TIMEOUT_DEFAULT = 1500 ,
69
+ QUERY_REQ_TIMEOUT_MAX = 30000
70
+ };
67
71
68
72
/* Advanced RPMB request timeout */
69
73
#define ADVANCED_RPMB_REQ_TIMEOUT 3000 /* 3 seconds */
@@ -135,6 +139,23 @@ module_param_cb(uic_cmd_timeout, &uic_cmd_timeout_ops, &uic_cmd_timeout, 0644);
135
139
MODULE_PARM_DESC (uic_cmd_timeout ,
136
140
"UFS UIC command timeout in milliseconds. Defaults to 500ms. Supported values range from 500ms to 5 seconds inclusively" );
137
141
142
+ static unsigned int dev_cmd_timeout = QUERY_REQ_TIMEOUT_DEFAULT ;
143
+
144
+ static int dev_cmd_timeout_set (const char * val , const struct kernel_param * kp )
145
+ {
146
+ return param_set_uint_minmax (val , kp , QUERY_REQ_TIMEOUT_MIN ,
147
+ QUERY_REQ_TIMEOUT_MAX );
148
+ }
149
+
150
+ static const struct kernel_param_ops dev_cmd_timeout_ops = {
151
+ .set = dev_cmd_timeout_set ,
152
+ .get = param_get_uint ,
153
+ };
154
+
155
+ module_param_cb (dev_cmd_timeout , & dev_cmd_timeout_ops , & dev_cmd_timeout , 0644 );
156
+ MODULE_PARM_DESC (dev_cmd_timeout ,
157
+ "UFS Device command timeout in milliseconds. Defaults to 1.5s. Supported values range from 1ms to 30 seconds inclusively" );
158
+
138
159
#define ufshcd_toggle_vreg (_dev , _vreg , _on ) \
139
160
({ \
140
161
int _ret; \
@@ -3362,7 +3383,7 @@ int ufshcd_query_flag(struct ufs_hba *hba, enum query_opcode opcode,
3362
3383
struct ufs_query_req * request = NULL ;
3363
3384
struct ufs_query_res * response = NULL ;
3364
3385
int err , selector = 0 ;
3365
- int timeout = QUERY_REQ_TIMEOUT ;
3386
+ int timeout = dev_cmd_timeout ;
3366
3387
3367
3388
BUG_ON (!hba );
3368
3389
@@ -3459,7 +3480,7 @@ int ufshcd_query_attr(struct ufs_hba *hba, enum query_opcode opcode,
3459
3480
goto out_unlock ;
3460
3481
}
3461
3482
3462
- err = ufshcd_exec_dev_cmd (hba , DEV_CMD_TYPE_QUERY , QUERY_REQ_TIMEOUT );
3483
+ err = ufshcd_exec_dev_cmd (hba , DEV_CMD_TYPE_QUERY , dev_cmd_timeout );
3463
3484
3464
3485
if (err ) {
3465
3486
dev_err (hba -> dev , "%s: opcode 0x%.2x for idn %d failed, index %d, err = %d\n" ,
@@ -3555,7 +3576,7 @@ static int __ufshcd_query_descriptor(struct ufs_hba *hba,
3555
3576
goto out_unlock ;
3556
3577
}
3557
3578
3558
- err = ufshcd_exec_dev_cmd (hba , DEV_CMD_TYPE_QUERY , QUERY_REQ_TIMEOUT );
3579
+ err = ufshcd_exec_dev_cmd (hba , DEV_CMD_TYPE_QUERY , dev_cmd_timeout );
3559
3580
3560
3581
if (err ) {
3561
3582
dev_err (hba -> dev , "%s: opcode 0x%.2x for idn %d failed, index %d, err = %d\n" ,
@@ -6017,7 +6038,7 @@ int ufshcd_read_device_lvl_exception_id(struct ufs_hba *hba, u64 *exception_id)
6017
6038
6018
6039
request -> query_func = UPIU_QUERY_FUNC_STANDARD_READ_REQUEST ;
6019
6040
6020
- err = ufshcd_exec_dev_cmd (hba , DEV_CMD_TYPE_QUERY , QUERY_REQ_TIMEOUT );
6041
+ err = ufshcd_exec_dev_cmd (hba , DEV_CMD_TYPE_QUERY , dev_cmd_timeout );
6021
6042
6022
6043
if (err ) {
6023
6044
dev_err (hba -> dev , "%s: failed to read device level exception %d\n" ,
@@ -7278,7 +7299,7 @@ static int ufshcd_issue_devman_upiu_cmd(struct ufs_hba *hba,
7278
7299
* bound to fail since dev_cmd.query and dev_cmd.type were left empty.
7279
7300
* read the response directly ignoring all errors.
7280
7301
*/
7281
- ufshcd_issue_dev_cmd (hba , lrbp , tag , QUERY_REQ_TIMEOUT );
7302
+ ufshcd_issue_dev_cmd (hba , lrbp , tag , dev_cmd_timeout );
7282
7303
7283
7304
/* just copy the upiu response as it is */
7284
7305
memcpy (rsp_upiu , lrbp -> ucd_rsp_ptr , sizeof (* rsp_upiu ));
@@ -8716,7 +8737,7 @@ static void ufshcd_set_timestamp_attr(struct ufs_hba *hba)
8716
8737
8717
8738
put_unaligned_be64 (ktime_get_real_ns (), & upiu_data -> osf3 );
8718
8739
8719
- err = ufshcd_exec_dev_cmd (hba , DEV_CMD_TYPE_QUERY , QUERY_REQ_TIMEOUT );
8740
+ err = ufshcd_exec_dev_cmd (hba , DEV_CMD_TYPE_QUERY , dev_cmd_timeout );
8720
8741
8721
8742
if (err )
8722
8743
dev_err (hba -> dev , "%s: failed to set timestamp %d\n" ,
0 commit comments