net/sfc/base: add API to inform libefx of hardware removal
authorAndy Moreton <amoreton@solarflare.com>
Mon, 10 Sep 2018 09:33:24 +0000 (10:33 +0100)
committerFerruh Yigit <ferruh.yigit@intel.com>
Thu, 27 Sep 2018 23:41:02 +0000 (01:41 +0200)
The efx_nic_hw_unavailable() checks ensure that if the NIC hardware
has failed or has been physically removed then libefx will stop
further attempts to access the hardware.

Add an interface for libefx clients to force unavailability, so the
hardware is treated as dead or removed even if still physically present.

Signed-off-by: Andy Moreton <amoreton@solarflare.com>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
drivers/net/sfc/base/ef10_impl.h
drivers/net/sfc/base/ef10_nic.c
drivers/net/sfc/base/efx.h
drivers/net/sfc/base/efx_impl.h
drivers/net/sfc/base/efx_nic.c

index 0214a75..2819ae6 100644 (file)
@@ -194,6 +194,10 @@ extern     __checkReturn   boolean_t
 ef10_nic_hw_unavailable(
        __in            efx_nic_t *enp);
 
+extern                 void
+ef10_nic_set_hw_unavailable(
+       __in            efx_nic_t *enp);
+
 #if EFSYS_OPT_DIAG
 
 extern __checkReturn   efx_rc_t
index ff96a7f..0a2474f 100644 (file)
@@ -2320,12 +2320,20 @@ ef10_nic_hw_unavailable(
        return (B_FALSE);
 
 unavail:
-       EFSYS_PROBE(hw_unavail);
-       enp->en_reset_flags |= EFX_RESET_HW_UNAVAIL;
+       ef10_nic_set_hw_unavailable(enp);
 
        return (B_TRUE);
 }
 
+                       void
+ef10_nic_set_hw_unavailable(
+       __in            efx_nic_t *enp)
+{
+       EFSYS_PROBE(hw_unavail);
+       enp->en_reset_flags |= EFX_RESET_HW_UNAVAIL;
+}
+
+
                        void
 ef10_nic_fini(
        __in            efx_nic_t *enp)
index fce5190..0982a34 100644 (file)
@@ -159,6 +159,10 @@ extern     __checkReturn   boolean_t
 efx_nic_hw_unavailable(
        __in            efx_nic_t *enp);
 
+extern                 void
+efx_nic_set_hw_unavailable(
+       __in            efx_nic_t *enp);
+
 #if EFSYS_OPT_DIAG
 
 extern __checkReturn   efx_rc_t
index 8a7dc8c..2c95571 100644 (file)
@@ -358,6 +358,7 @@ typedef struct efx_nic_ops_s {
        efx_rc_t        (*eno_get_bar_region)(efx_nic_t *, efx_nic_region_t,
                                        uint32_t *, size_t *);
        boolean_t       (*eno_hw_unavailable)(efx_nic_t *);
+       void            (*eno_set_hw_unavailable)(efx_nic_t *);
 #if EFSYS_OPT_DIAG
        efx_rc_t        (*eno_register_test)(efx_nic_t *);
 #endif /* EFSYS_OPT_DIAG */
index 22e464a..e5cb010 100644 (file)
@@ -101,6 +101,7 @@ static const efx_nic_ops_t  __efx_nic_siena_ops = {
        NULL,                           /* eno_get_vi_pool */
        NULL,                           /* eno_get_bar_region */
        NULL,                           /* eno_hw_unavailable */
+       NULL,                           /* eno_set_hw_unavailable */
 #if EFSYS_OPT_DIAG
        siena_nic_register_test,        /* eno_register_test */
 #endif /* EFSYS_OPT_DIAG */
@@ -121,6 +122,7 @@ static const efx_nic_ops_t  __efx_nic_hunt_ops = {
        ef10_nic_get_vi_pool,           /* eno_get_vi_pool */
        ef10_nic_get_bar_region,        /* eno_get_bar_region */
        ef10_nic_hw_unavailable,        /* eno_hw_unavailable */
+       ef10_nic_set_hw_unavailable,    /* eno_set_hw_unavailable */
 #if EFSYS_OPT_DIAG
        ef10_nic_register_test,         /* eno_register_test */
 #endif /* EFSYS_OPT_DIAG */
@@ -141,6 +143,7 @@ static const efx_nic_ops_t  __efx_nic_medford_ops = {
        ef10_nic_get_vi_pool,           /* eno_get_vi_pool */
        ef10_nic_get_bar_region,        /* eno_get_bar_region */
        ef10_nic_hw_unavailable,        /* eno_hw_unavailable */
+       ef10_nic_set_hw_unavailable,    /* eno_set_hw_unavailable */
 #if EFSYS_OPT_DIAG
        ef10_nic_register_test,         /* eno_register_test */
 #endif /* EFSYS_OPT_DIAG */
@@ -161,6 +164,7 @@ static const efx_nic_ops_t  __efx_nic_medford2_ops = {
        ef10_nic_get_vi_pool,           /* eno_get_vi_pool */
        ef10_nic_get_bar_region,        /* eno_get_bar_region */
        ef10_nic_hw_unavailable,        /* eno_hw_unavailable */
+       ef10_nic_set_hw_unavailable,    /* eno_set_hw_unavailable */
 #if EFSYS_OPT_DIAG
        ef10_nic_register_test,         /* eno_register_test */
 #endif /* EFSYS_OPT_DIAG */
@@ -673,11 +677,21 @@ efx_nic_hw_unavailable(
        return (B_FALSE);
 
 unavail:
-       EFSYS_PROBE(hw_unavail);
-
        return (B_TRUE);
 }
 
+                       void
+efx_nic_set_hw_unavailable(
+       __in            efx_nic_t *enp)
+{
+       const efx_nic_ops_t *enop = enp->en_enop;
+
+       EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
+
+       if (enop->eno_set_hw_unavailable != NULL)
+               enop->eno_set_hw_unavailable(enp);
+}
+
 
 #if EFSYS_OPT_DIAG