========
 
 - Use pci_try_reset_function() to reset the MHI function during recovery process
   to avoid the deadlock reported on the X1E80100 CRD device. The deadlock can
   happen if the caller has already acquired the 'device_lock()' while calling
   the recovery function. So using pci_try_reset_function() avoids the deadlock
   by returning -EAGAIN if the lock was already acquired.
 -----BEGIN PGP SIGNATURE-----
 
 iQEzBAABCgAdFiEEZ6VDKoFIy9ikWCeXVZ8R5v6RzvUFAme2ypUACgkQVZ8R5v6R
 zvWuKgf/eyQqHdgKU/v+FBF4g65bWj+EXYxwu8jhLxAsE1rlrwQSozHp7xb+RyNV
 P92DGkfX+Dplm4hAUnZKhqzoGtKAdeuyjcvs5/+1O2lWMojxkQlT3EUEc7YRNmVI
 aqFO+KaeqklF5HL8HOqkyFmiCoig9M63o4JWkjxyqTMFr2G3C671SAY5BSRVg6ms
 9gV8j+8sI+DkElsSSd6/n3jibEplHx34g15HCstGoU5/rAke3Gl97l3mK7shbRC0
 FORoTSH/L7CguLDJzQmi2nq9tQNflIR4YNaEHWhYbaSziDVYuQ+XB+mIZ7lGn/UD
 3EqvKsJw5KS+7TvdhuiCi1k0V+26rA==
 =DoWM
 -----END PGP SIGNATURE-----

Merge tag 'mhi-fixes-for-v6.14' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/mani/mhi into char-misc-linus

Manivannan writes:

MHI Host
========

- Use pci_try_reset_function() to reset the MHI function during recovery process
  to avoid the deadlock reported on the X1E80100 CRD device. The deadlock can
  happen if the caller has already acquired the 'device_lock()' while calling
  the recovery function. So using pci_try_reset_function() avoids the deadlock
  by returning -EAGAIN if the lock was already acquired.

* tag 'mhi-fixes-for-v6.14' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/mani/mhi:
  bus: mhi: host: pci_generic: Use pci_try_reset_function() to avoid deadlock
This commit is contained in:
Greg Kroah-Hartman 2025-02-20 09:00:05 +01:00
commit 6d306090ea

View File

@ -1095,8 +1095,9 @@ static void mhi_pci_recovery_work(struct work_struct *work)
err_unprepare:
mhi_unprepare_after_power_down(mhi_cntrl);
err_try_reset:
if (pci_reset_function(pdev))
dev_err(&pdev->dev, "Recovery failed\n");
err = pci_try_reset_function(pdev);
if (err)
dev_err(&pdev->dev, "Recovery failed: %d\n", err);
}
static void health_check(struct timer_list *t)