f235252493d37a87032b458853929421ab9ea0fa
[dpdk.git] / drivers / net / sfc / base / efx_evb.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  *
3  * Copyright (c) 2018-2019 Solarflare Communications Inc.
4  * All rights reserved.
5  */
6
7 #include "efx.h"
8 #include "efx_impl.h"
9
10
11 #if EFSYS_OPT_EVB
12
13 #if EFSYS_OPT_SIENA
14 static const efx_evb_ops_t      __efx_evb_dummy_ops = {
15         NULL,           /* eeo_init */
16         NULL,           /* eeo_fini */
17 };
18 #endif /* EFSYS_OPT_SIENA */
19
20 #if EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2
21 static const efx_evb_ops_t      __efx_evb_ef10_ops = {
22         ef10_evb_init,          /* eeo_init */
23         ef10_evb_fini,          /* eeo_fini */
24 };
25 #endif /* EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 */
26
27         __checkReturn   efx_rc_t
28 efx_evb_init(
29         __in            efx_nic_t *enp)
30 {
31         const efx_evb_ops_t *eeop;
32         efx_rc_t rc;
33         efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
34
35         EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
36         EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
37         EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_EVB));
38
39         switch (enp->en_family) {
40 #if EFSYS_OPT_SIENA
41         case EFX_FAMILY_SIENA:
42                 eeop = &__efx_evb_dummy_ops;
43                 break;
44 #endif /* EFSYS_OPT_SIENA */
45
46 #if EFSYS_OPT_HUNTINGTON
47         case EFX_FAMILY_HUNTINGTON:
48                 eeop = &__efx_evb_ef10_ops;
49                 break;
50 #endif /* EFSYS_OPT_HUNTINGTON */
51
52 #if EFSYS_OPT_MEDFORD
53         case EFX_FAMILY_MEDFORD:
54                 eeop = &__efx_evb_ef10_ops;
55                 break;
56 #endif /* EFSYS_OPT_MEDFORD */
57
58 #if EFSYS_OPT_MEDFORD2
59         case EFX_FAMILY_MEDFORD2:
60                 eeop = &__efx_evb_ef10_ops;
61                 break;
62 #endif /* EFSYS_OPT_MEDFORD2 */
63
64         default:
65                 EFSYS_ASSERT(0);
66                 rc = ENOTSUP;
67                 goto fail1;
68         }
69
70         if (!encp->enc_datapath_cap_evb || !eeop->eeo_init) {
71                 rc = ENOTSUP;
72                 goto fail2;
73         }
74
75         if ((rc = eeop->eeo_init(enp)) != 0)
76                 goto fail3;
77
78         enp->en_eeop = eeop;
79         enp->en_mod_flags |= EFX_MOD_EVB;
80         return (0);
81
82 fail3:
83         EFSYS_PROBE(fail3);
84 fail2:
85         EFSYS_PROBE(fail2);
86 fail1:
87         EFSYS_PROBE1(fail1, efx_rc_t, rc);
88
89         return (rc);
90 }
91
92                         void
93 efx_evb_fini(
94         __in            efx_nic_t *enp)
95 {
96         const efx_evb_ops_t *eeop = enp->en_eeop;
97
98         EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
99         EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROBE);
100         EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_RX));
101         EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_TX));
102
103         if (eeop && eeop->eeo_fini)
104                 eeop->eeo_fini(enp);
105
106         enp->en_eeop = NULL;
107         enp->en_mod_flags &= ~EFX_MOD_EVB;
108 }
109
110 #endif