> > From: Subhash Jadavani <subhashj@xxxxxxxxxxxxxx> > > During clock gating (ufshcd_gate_work()), we first put the link hibern8 by > calling ufshcd_uic_hibern8_enter() and if ufshcd_uic_hibern8_enter() returns > success (0) then we gate all the clocks. > Now let’s zoom in to what ufshcd_uic_hibern8_enter() does internally: > It calls __ufshcd_uic_hibern8_enter() and if failure is encountered, link recovery > shall put the link back to the highest HS gear and returns success (0) to > ufshcd_uic_hibern8_enter() which is the issue as link is still in active state due to > recovery! > Now ufshcd_uic_hibern8_enter() returns success to ufshcd_gate_work() and > hence it goes ahead with gating the UFS clock while link is still in active state > hence I believe controller would raise UIC error interrupts. But when we service > the interrupt, clocks might have already been disabled! > > This change fixes for this by returning failure from > __ufshcd_uic_hibern8_enter() if recovery succeeds as link is still not in hibern8, > upon receiving the error ufshcd_hibern8_enter() would initiate retry to put the > link state back into hibern8. > > Signed-off-by: Subhash Jadavani <subhashj@xxxxxxxxxxxxxx> > Signed-off-by: Can Guo <cang@xxxxxxxxxxxxxx> Reviewed-by: Avri Altman <avri.altman@xxxxxxx>