net/sfc/base: add EVB module vSwitch/vPort/vAdaptor ops
[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         NULL,           /* eeo_vswitch_alloc */
18         NULL,           /* eeo_vswitch_free */
19         NULL,           /* eeo_vport_alloc */
20         NULL,           /* eeo_vport_free */
21         NULL,           /* eeo_vport_mac_addr_add */
22         NULL,           /* eeo_vport_mac_addr_del */
23         NULL,           /* eeo_vadaptor_alloc */
24         NULL,           /* eeo_vadaptor_free */
25         NULL,           /* eeo_vport_assign */
26 };
27 #endif /* EFSYS_OPT_SIENA */
28
29 #if EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2
30 static const efx_evb_ops_t      __efx_evb_ef10_ops = {
31         ef10_evb_init,                  /* eeo_init */
32         ef10_evb_fini,                  /* eeo_fini */
33         ef10_evb_vswitch_alloc,         /* eeo_vswitch_alloc */
34         ef10_evb_vswitch_free,          /* eeo_vswitch_free */
35         ef10_evb_vport_alloc,           /* eeo_vport_alloc */
36         ef10_evb_vport_free,            /* eeo_vport_free */
37         ef10_evb_vport_mac_addr_add,    /* eeo_vport_mac_addr_add */
38         ef10_evb_vport_mac_addr_del,    /* eeo_vport_mac_addr_del */
39         ef10_evb_vadaptor_alloc,        /* eeo_vadaptor_alloc */
40         ef10_evb_vadaptor_free,         /* eeo_vadaptor_free */
41         ef10_evb_vport_assign,          /* eeo_vport_assign */
42 };
43 #endif /* EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 */
44
45         __checkReturn   efx_rc_t
46 efx_evb_init(
47         __in            efx_nic_t *enp)
48 {
49         const efx_evb_ops_t *eeop;
50         efx_rc_t rc;
51         efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
52
53         EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
54         EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
55         EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_EVB));
56
57         switch (enp->en_family) {
58 #if EFSYS_OPT_SIENA
59         case EFX_FAMILY_SIENA:
60                 eeop = &__efx_evb_dummy_ops;
61                 break;
62 #endif /* EFSYS_OPT_SIENA */
63
64 #if EFSYS_OPT_HUNTINGTON
65         case EFX_FAMILY_HUNTINGTON:
66                 eeop = &__efx_evb_ef10_ops;
67                 break;
68 #endif /* EFSYS_OPT_HUNTINGTON */
69
70 #if EFSYS_OPT_MEDFORD
71         case EFX_FAMILY_MEDFORD:
72                 eeop = &__efx_evb_ef10_ops;
73                 break;
74 #endif /* EFSYS_OPT_MEDFORD */
75
76 #if EFSYS_OPT_MEDFORD2
77         case EFX_FAMILY_MEDFORD2:
78                 eeop = &__efx_evb_ef10_ops;
79                 break;
80 #endif /* EFSYS_OPT_MEDFORD2 */
81
82         default:
83                 EFSYS_ASSERT(0);
84                 rc = ENOTSUP;
85                 goto fail1;
86         }
87
88         if (!encp->enc_datapath_cap_evb || !eeop->eeo_init) {
89                 rc = ENOTSUP;
90                 goto fail2;
91         }
92
93         if ((rc = eeop->eeo_init(enp)) != 0)
94                 goto fail3;
95
96         enp->en_eeop = eeop;
97         enp->en_mod_flags |= EFX_MOD_EVB;
98         return (0);
99
100 fail3:
101         EFSYS_PROBE(fail3);
102 fail2:
103         EFSYS_PROBE(fail2);
104 fail1:
105         EFSYS_PROBE1(fail1, efx_rc_t, rc);
106
107         return (rc);
108 }
109
110         void
111 efx_evb_fini(
112         __in            efx_nic_t *enp)
113 {
114         const efx_evb_ops_t *eeop = enp->en_eeop;
115
116         EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
117         EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROBE);
118         EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_RX));
119         EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_TX));
120
121         if (eeop && eeop->eeo_fini)
122                 eeop->eeo_fini(enp);
123
124         enp->en_eeop = NULL;
125         enp->en_mod_flags &= ~EFX_MOD_EVB;
126 }
127
128 #endif