1 /* SPDX-License-Identifier: BSD-3-Clause
3 * Copyright(c) 2020-2021 Xilinx, Inc.
11 #if EFSYS_OPT_RIVERHEAD
12 static const efx_virtio_ops_t __efx_virtio_rhead_ops = {
13 rhead_virtio_qstart, /* evo_virtio_qstart */
14 rhead_virtio_qstop, /* evo_virtio_qstop */
16 #endif /* EFSYS_OPT_RIVERHEAD */
18 __checkReturn efx_rc_t
22 const efx_virtio_ops_t *evop;
25 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
26 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
27 EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_VIRTIO));
29 switch (enp->en_family) {
30 #if EFSYS_OPT_RIVERHEAD
31 case EFX_FAMILY_RIVERHEAD:
32 evop = &__efx_virtio_rhead_ops;
34 #endif /* EFSYS_OPT_RIVERHEAD */
43 enp->en_mod_flags |= EFX_MOD_VIRTIO;
48 EFSYS_PROBE1(fail1, efx_rc_t, rc);
51 enp->en_mod_flags &= ~EFX_MOD_VIRTIO;
60 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
61 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
62 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_VIRTIO);
65 enp->en_mod_flags &= ~EFX_MOD_VIRTIO;
68 __checkReturn efx_rc_t
71 __deref_out efx_virtio_vq_t **evvpp)
73 const efx_virtio_ops_t *evop = enp->en_evop;
74 efx_virtio_vq_t *evvp;
77 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
78 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_VIRTIO);
80 /* Allocate a virtqueue object */
81 EFSYS_KMEM_ALLOC(enp->en_esip, sizeof (efx_virtio_vq_t), evvp);
87 evvp->evv_magic = EFX_VQ_MAGIC;
89 evvp->evv_state = EFX_VIRTIO_VQ_STATE_INITIALIZED;
96 EFSYS_PROBE1(fail1, efx_rc_t, rc);
101 __checkReturn efx_rc_t
103 __in efx_virtio_vq_t *evvp,
104 __in efx_virtio_vq_cfg_t *evvcp,
105 __in_opt efx_virtio_vq_dyncfg_t *evvdp)
107 const efx_virtio_ops_t *evop;
110 if ((evvcp == NULL) || (evvp == NULL)) {
115 if (evvp->evv_state != EFX_VIRTIO_VQ_STATE_INITIALIZED) {
120 evop = evvp->evv_enp->en_evop;
126 if ((rc = evop->evo_virtio_qstart(evvp, evvcp, evvdp)) != 0)
129 evvp->evv_type = evvcp->evvc_type;
130 evvp->evv_target_vf = evvcp->evvc_target_vf;
131 evvp->evv_state = EFX_VIRTIO_VQ_STATE_STARTED;
142 EFSYS_PROBE1(fail1, efx_rc_t, rc);
147 __checkReturn efx_rc_t
149 __in efx_virtio_vq_t *evvp,
150 __out_opt efx_virtio_vq_dyncfg_t *evvdp)
153 const efx_virtio_ops_t *evop;
164 EFSYS_ASSERT3U(evvp->evv_magic, ==, EFX_VQ_MAGIC);
165 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
166 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_VIRTIO);
173 if (evvp->evv_state != EFX_VIRTIO_VQ_STATE_STARTED) {
178 if ((rc = evop->evo_virtio_qstop(evvp, evvdp)) != 0)
181 evvp->evv_state = EFX_VIRTIO_VQ_STATE_INITIALIZED;
192 EFSYS_PROBE1(fail1, efx_rc_t, rc);
199 __in efx_virtio_vq_t *evvp)
208 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
210 if (evvp->evv_state == EFX_VIRTIO_VQ_STATE_INITIALIZED) {
211 /* Free the virtqueue object */
212 EFSYS_KMEM_FREE(enp->en_esip, sizeof (efx_virtio_vq_t), evvp);
216 #endif /* EFSYS_OPT_VIRTIO */