We handle everything ourselves in ef100_reset(), rather than relying on
 the generic down/up routines.

Signed-off-by: Edward Cree <ec...@solarflare.com>
---
 drivers/net/ethernet/sfc/efx_common.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/sfc/efx_common.c 
b/drivers/net/ethernet/sfc/efx_common.c
index 5667694c6514..1bccd1f2cfa6 100644
--- a/drivers/net/ethernet/sfc/efx_common.c
+++ b/drivers/net/ethernet/sfc/efx_common.c
@@ -821,7 +821,11 @@ int efx_reset(struct efx_nic *efx, enum reset_type method)
                   RESET_TYPE(method));
 
        efx_device_detach_sync(efx);
-       efx_reset_down(efx, method);
+       /* efx_reset_down() grabs locks that prevent recovery on EF100.
+        * EF100 reset is handled in the efx_nic_type callback below.
+        */
+       if (efx_nic_rev(efx) != EFX_REV_EF100)
+               efx_reset_down(efx, method);
 
        rc = efx->type->reset(efx, method);
        if (rc) {
@@ -849,7 +853,8 @@ int efx_reset(struct efx_nic *efx, enum reset_type method)
        disabled = rc ||
                method == RESET_TYPE_DISABLE ||
                method == RESET_TYPE_RECOVER_OR_DISABLE;
-       rc2 = efx_reset_up(efx, method, !disabled);
+       if (efx_nic_rev(efx) != EFX_REV_EF100)
+               rc2 = efx_reset_up(efx, method, !disabled);
        if (rc2) {
                disabled = true;
                if (!rc)

Reply via email to