bnxt_en: Fix race between firmware reset and driver remove.
authorVasundhara Volam <vasundhara-v.volam@broadcom.com>
Fri, 26 Feb 2021 09:43:09 +0000 (04:43 -0500)
committerJakub Kicinski <kuba@kernel.org>
Fri, 26 Feb 2021 23:50:23 +0000 (15:50 -0800)
commitd20cd745218cde1b268bef5282095ec6c95a3ea2
tree6eae033f4c70ebe4307db216c1bacb2e5a71f42d
parent82adc457ac3bfff058847b36a5dbce75a86a575a
bnxt_en: Fix race between firmware reset and driver remove.

The driver's error recovery reset sequence can take many seconds to
complete and only the critical sections are protected by rtnl_lock.
A recent change has introduced a regression in this sequence.

bnxt_remove_one() may be called while the recovery is in progress.
Normally, unregister_netdev() would cause bnxt_close_nic() to be
called and this would cause the error recovery to safely abort
with the BNXT_STATE_ABORT_ERR flag set in bnxt_close_nic().

Recently, we added bnxt_reinit_after_abort() to allow the user to
reopen the device after an aborted recovery.  This causes the
regression in the scenario described above because we would
attempt to re-open even after the netdev has been unregistered.

Fix it by checking the netdev reg_state in
bnxt_reinit_after_abort() and abort if it is unregistered.

Fixes: 6882c36cf82e ("bnxt_en: attempt to reinitialize after aborted reset")
Signed-off-by: Vasundhara Volam <vasundhara-v.volam@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/broadcom/bnxt/bnxt.c