@@ -3274,6 +3274,20 @@ static int ufshcd_wait_for_dev_cmd(struct ufs_hba *hba,
32743274 return err ;
32753275}
32763276
3277+ static void ufshcd_dev_man_lock (struct ufs_hba * hba )
3278+ {
3279+ ufshcd_hold (hba );
3280+ mutex_lock (& hba -> dev_cmd .lock );
3281+ down_read (& hba -> clk_scaling_lock );
3282+ }
3283+
3284+ static void ufshcd_dev_man_unlock (struct ufs_hba * hba )
3285+ {
3286+ up_read (& hba -> clk_scaling_lock );
3287+ mutex_unlock (& hba -> dev_cmd .lock );
3288+ ufshcd_release (hba );
3289+ }
3290+
32773291/**
32783292 * ufshcd_exec_dev_cmd - API for sending device management requests
32793293 * @hba: UFS hba
@@ -3296,8 +3310,6 @@ static int ufshcd_exec_dev_cmd(struct ufs_hba *hba,
32963310 /* Protects use of hba->reserved_slot. */
32973311 lockdep_assert_held (& hba -> dev_cmd .lock );
32983312
3299- down_read (& hba -> clk_scaling_lock );
3300-
33013313 lrbp = & hba -> lrb [tag ];
33023314 lrbp -> cmd = NULL ;
33033315 err = ufshcd_compose_dev_cmd (hba , lrbp , cmd_type , tag );
@@ -3314,7 +3326,6 @@ static int ufshcd_exec_dev_cmd(struct ufs_hba *hba,
33143326 (struct utp_upiu_req * )lrbp -> ucd_rsp_ptr );
33153327
33163328out :
3317- up_read (& hba -> clk_scaling_lock );
33183329 return err ;
33193330}
33203331
@@ -3385,8 +3396,8 @@ int ufshcd_query_flag(struct ufs_hba *hba, enum query_opcode opcode,
33853396
33863397 BUG_ON (!hba );
33873398
3388- ufshcd_hold (hba );
3389- mutex_lock ( & hba -> dev_cmd . lock );
3399+ ufshcd_dev_man_lock (hba );
3400+
33903401 ufshcd_init_query (hba , & request , & response , opcode , idn , index ,
33913402 selector );
33923403
@@ -3428,8 +3439,7 @@ int ufshcd_query_flag(struct ufs_hba *hba, enum query_opcode opcode,
34283439 MASK_QUERY_UPIU_FLAG_LOC ) & 0x1 ;
34293440
34303441out_unlock :
3431- mutex_unlock (& hba -> dev_cmd .lock );
3432- ufshcd_release (hba );
3442+ ufshcd_dev_man_unlock (hba );
34333443 return err ;
34343444}
34353445
@@ -3459,9 +3469,8 @@ int ufshcd_query_attr(struct ufs_hba *hba, enum query_opcode opcode,
34593469 return - EINVAL ;
34603470 }
34613471
3462- ufshcd_hold (hba );
3472+ ufshcd_dev_man_lock (hba );
34633473
3464- mutex_lock (& hba -> dev_cmd .lock );
34653474 ufshcd_init_query (hba , & request , & response , opcode , idn , index ,
34663475 selector );
34673476
@@ -3491,8 +3500,7 @@ int ufshcd_query_attr(struct ufs_hba *hba, enum query_opcode opcode,
34913500 * attr_val = be32_to_cpu (response -> upiu_res .value );
34923501
34933502out_unlock :
3494- mutex_unlock (& hba -> dev_cmd .lock );
3495- ufshcd_release (hba );
3503+ ufshcd_dev_man_unlock (hba );
34963504 return err ;
34973505}
34983506
@@ -3555,9 +3563,8 @@ static int __ufshcd_query_descriptor(struct ufs_hba *hba,
35553563 return - EINVAL ;
35563564 }
35573565
3558- ufshcd_hold (hba );
3566+ ufshcd_dev_man_lock (hba );
35593567
3560- mutex_lock (& hba -> dev_cmd .lock );
35613568 ufshcd_init_query (hba , & request , & response , opcode , idn , index ,
35623569 selector );
35633570 hba -> dev_cmd .query .descriptor = desc_buf ;
@@ -3590,8 +3597,7 @@ static int __ufshcd_query_descriptor(struct ufs_hba *hba,
35903597
35913598out_unlock :
35923599 hba -> dev_cmd .query .descriptor = NULL ;
3593- mutex_unlock (& hba -> dev_cmd .lock );
3594- ufshcd_release (hba );
3600+ ufshcd_dev_man_unlock (hba );
35953601 return err ;
35963602}
35973603
@@ -5072,8 +5078,8 @@ static int ufshcd_verify_dev_init(struct ufs_hba *hba)
50725078 int err = 0 ;
50735079 int retries ;
50745080
5075- ufshcd_hold (hba );
5076- mutex_lock ( & hba -> dev_cmd . lock );
5081+ ufshcd_dev_man_lock (hba );
5082+
50775083 for (retries = NOP_OUT_RETRIES ; retries > 0 ; retries -- ) {
50785084 err = ufshcd_exec_dev_cmd (hba , DEV_CMD_TYPE_NOP ,
50795085 hba -> nop_out_timeout );
@@ -5083,8 +5089,8 @@ static int ufshcd_verify_dev_init(struct ufs_hba *hba)
50835089
50845090 dev_dbg (hba -> dev , "%s: error %d retrying\n" , __func__ , err );
50855091 }
5086- mutex_unlock ( & hba -> dev_cmd . lock );
5087- ufshcd_release (hba );
5092+
5093+ ufshcd_dev_man_unlock (hba );
50885094
50895095 if (err )
50905096 dev_err (hba -> dev , "%s: NOP OUT failed %d\n" , __func__ , err );
@@ -7210,8 +7216,6 @@ static int ufshcd_issue_devman_upiu_cmd(struct ufs_hba *hba,
72107216 /* Protects use of hba->reserved_slot. */
72117217 lockdep_assert_held (& hba -> dev_cmd .lock );
72127218
7213- down_read (& hba -> clk_scaling_lock );
7214-
72157219 lrbp = & hba -> lrb [tag ];
72167220 lrbp -> cmd = NULL ;
72177221 lrbp -> task_tag = tag ;
@@ -7276,7 +7280,6 @@ static int ufshcd_issue_devman_upiu_cmd(struct ufs_hba *hba,
72767280 ufshcd_add_query_upiu_trace (hba , err ? UFS_QUERY_ERR : UFS_QUERY_COMP ,
72777281 (struct utp_upiu_req * )lrbp -> ucd_rsp_ptr );
72787282
7279- up_read (& hba -> clk_scaling_lock );
72807283 return err ;
72817284}
72827285
@@ -7315,13 +7318,11 @@ int ufshcd_exec_raw_upiu_cmd(struct ufs_hba *hba,
73157318 cmd_type = DEV_CMD_TYPE_NOP ;
73167319 fallthrough ;
73177320 case UPIU_TRANSACTION_QUERY_REQ :
7318- ufshcd_hold (hba );
7319- mutex_lock (& hba -> dev_cmd .lock );
7321+ ufshcd_dev_man_lock (hba );
73207322 err = ufshcd_issue_devman_upiu_cmd (hba , req_upiu , rsp_upiu ,
73217323 desc_buff , buff_len ,
73227324 cmd_type , desc_op );
7323- mutex_unlock (& hba -> dev_cmd .lock );
7324- ufshcd_release (hba );
7325+ ufshcd_dev_man_unlock (hba );
73257326
73267327 break ;
73277328 case UPIU_TRANSACTION_TASK_REQ :
@@ -7381,9 +7382,7 @@ int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *r
73817382 u16 ehs_len ;
73827383
73837384 /* Protects use of hba->reserved_slot. */
7384- ufshcd_hold (hba );
7385- mutex_lock (& hba -> dev_cmd .lock );
7386- down_read (& hba -> clk_scaling_lock );
7385+ ufshcd_dev_man_lock (hba );
73877386
73887387 lrbp = & hba -> lrb [tag ];
73897388 lrbp -> cmd = NULL ;
@@ -7449,9 +7448,8 @@ int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *r
74497448 }
74507449 }
74517450
7452- up_read (& hba -> clk_scaling_lock );
7453- mutex_unlock (& hba -> dev_cmd .lock );
7454- ufshcd_release (hba );
7451+ ufshcd_dev_man_unlock (hba );
7452+
74557453 return err ? : result ;
74567454}
74577455
@@ -8714,9 +8712,7 @@ static void ufshcd_set_timestamp_attr(struct ufs_hba *hba)
87148712 if (dev_info -> wspecversion < 0x400 )
87158713 return ;
87168714
8717- ufshcd_hold (hba );
8718-
8719- mutex_lock (& hba -> dev_cmd .lock );
8715+ ufshcd_dev_man_lock (hba );
87208716
87218717 ufshcd_init_query (hba , & request , & response ,
87228718 UPIU_QUERY_OPCODE_WRITE_ATTR ,
@@ -8734,8 +8730,7 @@ static void ufshcd_set_timestamp_attr(struct ufs_hba *hba)
87348730 dev_err (hba -> dev , "%s: failed to set timestamp %d\n" ,
87358731 __func__ , err );
87368732
8737- mutex_unlock (& hba -> dev_cmd .lock );
8738- ufshcd_release (hba );
8733+ ufshcd_dev_man_unlock (hba );
87398734}
87408735
87418736/**
0 commit comments