Hi, > > Currently bits in hba->outstanding_tasks are cleared only after their > corresponding task management commands are successfully done by > __ufshcd_issue_tm_cmd(). > > If timeout happens in a task management command, its corresponding > bit in hba->outstanding_tasks will not be cleared until next task > management command with the same tag used successfully finishes.‧ ufshcd_clear_tm_cmd is also called as part of ufshcd_err_handler. Does this change something in your assumptions? Thanks, Avri > > This is wrong and can lead to some issues, like power consumpton issue. > For example, ufshcd_release() and ufshcd_gate_work() will do nothing > if hba->outstanding_tasks is not zero even if both UFS host and devices > are actually idle. > > Because error handling flow, i.e., ufshcd_reset_and_restore(), will be > triggered after any task management command times out, we fix this by > clearing corresponding hba->outstanding_tasks bits during this flow. > To achieve this, we need a mask to track timed-out commands and thus > error handling flow can clear their tags specifically. > > Stanley Chu (2): > scsi: ufs: Make new function for clearing outstanding task bits > scsi: ufs: Fix broken hba->outstanding_tasks > > drivers/scsi/ufs/ufshcd.c | 49 +++++++++++++++++++++++++++++++++------ > drivers/scsi/ufs/ufshcd.h | 1 + > 2 files changed, 43 insertions(+), 7 deletions(-) > > -- > 2.18.0