drivers: init/fini MAE on attach/detach
authorIvan Malov <ivan.malov@oktetlabs.ru>
Tue, 20 Oct 2020 09:12:45 +0000 (10:12 +0100)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 3 Nov 2020 22:24:24 +0000 (23:24 +0100)
These actions affect MAE supplementary resources which are
libefx-internal.

Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
drivers/common/sfc_efx/efsys.h
drivers/net/sfc/sfc_mae.c

index 8636e73..bbe9f2e 100644 (file)
@@ -167,7 +167,7 @@ prefetch_read_once(const volatile void *addr)
 
 #define EFSYS_OPT_DESC_PROXY 0
 
-#define EFSYS_OPT_MAE 0
+#define EFSYS_OPT_MAE 1
 
 /* ID */
 
index 3ce654c..2a7ed63 100644 (file)
@@ -21,6 +21,7 @@ sfc_mae_attach(struct sfc_adapter *sa)
 {
        const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic);
        struct sfc_mae *mae = &sa->mae;
+       int rc;
 
        sfc_log_init(sa, "entry");
 
@@ -29,21 +30,37 @@ sfc_mae_attach(struct sfc_adapter *sa)
                return 0;
        }
 
+       sfc_log_init(sa, "init MAE");
+       rc = efx_mae_init(sa->nic);
+       if (rc != 0)
+               goto fail_mae_init;
+
        mae->status = SFC_MAE_STATUS_SUPPORTED;
 
        sfc_log_init(sa, "done");
 
        return 0;
+
+fail_mae_init:
+       sfc_log_init(sa, "failed %d", rc);
+
+       return rc;
 }
 
 void
 sfc_mae_detach(struct sfc_adapter *sa)
 {
        struct sfc_mae *mae = &sa->mae;
+       enum sfc_mae_status status_prev = mae->status;
 
        sfc_log_init(sa, "entry");
 
        mae->status = SFC_MAE_STATUS_UNKNOWN;
 
+       if (status_prev != SFC_MAE_STATUS_SUPPORTED)
+               return;
+
+       efx_mae_fini(sa->nic);
+
        sfc_log_init(sa, "done");
 }