scsi: ufs: Serialise ufs clock gating and ungating
On ufs based targets we observed several unclocked register access
issues due to race conditions between clock gating and ungating.
Sequence of events causing race looks like:
[1]ungate_work_scheduled = (tv64 = 27288.795244106),REQ_CLKS_ON
[2]gating_work_execute_end = (tv64 = 27288.795948169),REQ_CLKS_ON
[3]last intr status = (tv64 = 27288.801560512)
[4]ungate_work_execute_start=(tv64 = 27288.801725304),REQ_CLKS_ON
[5]clk_rel ctx=XFR_REQ_COMPL)(tv64 = 27288.801950460),REQ_CLKS_OFF
[6]gating_work_scheduled = (tv64 = 27288.812817231),REQ_CLKS_OFF
[7]gating_work_execute_start=(tv64 = 27288.813704106),REQ_CLKS_OFF
[8]clk_hold ctx = QUEUE_CMD) (tv64 = 27288.821010200)
[9](WRITE)issue_time_stamp = (tv64 = 27288.821059366),gating in progress!
[10]ungate_work_execute_end =(tv64 = 27288.821251866),CLKS_ON
[11]Gladiator Error Detected = 27288.830788
Here clock gating work[6] is scheduled while ungating[4] is in progress
thus causing unclocked register access when request is issued[9].
This change is to avoid such race condition by using single
threaded workqueue for both gate and ungate work.
Change-Id: I710ff0dbe59df0c1eb903b18555b6184cb298fa3
Signed-off-by: Sayali Lokhande <sayalil@codeaurora.org>
Loading
Please register or sign in to comment