1 /* SPDX-License-Identifier: BSD-3-Clause
2 *
3 * Copyright(c) 2019-2021 Xilinx, Inc.
4 * Copyright(c) 2018-2019 Solarflare Communications Inc.
5 */
6
7 #include "efx.h"
8 #include "efx_impl.h"
9
10
11 #if EFSYS_OPT_RIVERHEAD
12
13 __checkReturn efx_rc_t
rhead_tx_init(__in efx_nic_t * enp)14 rhead_tx_init(
15 __in efx_nic_t *enp)
16 {
17 _NOTE(ARGUNUSED(enp))
18 /* Nothing to do here */
19 return (0);
20 }
21
22 void
rhead_tx_fini(__in efx_nic_t * enp)23 rhead_tx_fini(
24 __in efx_nic_t *enp)
25 {
26 _NOTE(ARGUNUSED(enp))
27 /* Nothing to do here */
28 }
29
30 __checkReturn efx_rc_t
rhead_tx_qcreate(__in efx_nic_t * enp,__in unsigned int index,__in unsigned int label,__in efsys_mem_t * esmp,__in size_t ndescs,__in uint32_t id,__in uint16_t flags,__in efx_evq_t * eep,__in efx_txq_t * etp,__out unsigned int * addedp)31 rhead_tx_qcreate(
32 __in efx_nic_t *enp,
33 __in unsigned int index,
34 __in unsigned int label,
35 __in efsys_mem_t *esmp,
36 __in size_t ndescs,
37 __in uint32_t id,
38 __in uint16_t flags,
39 __in efx_evq_t *eep,
40 __in efx_txq_t *etp,
41 __out unsigned int *addedp)
42 {
43 efx_rc_t rc;
44
45 /*
46 * NMC manages the NMMU entries, and so buffer table IDs are
47 * ignored here
48 */
49 _NOTE(ARGUNUSED(id))
50
51 if ((rc = efx_mcdi_init_txq(enp, ndescs, eep->ee_index, label, index,
52 flags, esmp)) != 0)
53 goto fail1;
54
55 /*
56 * Return the initial queue index which is zero since no option
57 * descriptors are sent at start of day.
58 */
59 *addedp = 0;
60
61 return (0);
62
63 fail1:
64 EFSYS_PROBE1(fail1, efx_rc_t, rc);
65
66 return (rc);
67 }
68
69 void
rhead_tx_qdestroy(__in efx_txq_t * etp)70 rhead_tx_qdestroy(
71 __in efx_txq_t *etp)
72 {
73 _NOTE(ARGUNUSED(etp))
74 /* Nothing to do here */
75 }
76
77 __checkReturn efx_rc_t
rhead_tx_qpost(__in efx_txq_t * etp,__in_ecount (ndescs)efx_buffer_t * eb,__in unsigned int ndescs,__in unsigned int completed,__inout unsigned int * addedp)78 rhead_tx_qpost(
79 __in efx_txq_t *etp,
80 __in_ecount(ndescs) efx_buffer_t *eb,
81 __in unsigned int ndescs,
82 __in unsigned int completed,
83 __inout unsigned int *addedp)
84 {
85 _NOTE(ARGUNUSED(etp))
86 _NOTE(ARGUNUSED(eb))
87 _NOTE(ARGUNUSED(ndescs))
88 _NOTE(ARGUNUSED(completed))
89 _NOTE(ARGUNUSED(addedp))
90
91 /* FIXME Implement the method for Riverhead */
92
93 return (ENOTSUP);
94 }
95
96 void
rhead_tx_qpush(__in efx_txq_t * etp,__in unsigned int added,__in unsigned int pushed)97 rhead_tx_qpush(
98 __in efx_txq_t *etp,
99 __in unsigned int added,
100 __in unsigned int pushed)
101 {
102 _NOTE(ARGUNUSED(etp, added, pushed))
103
104 /* FIXME Implement the method for Riverhead */
105 EFSYS_ASSERT(B_FALSE);
106 }
107
108 __checkReturn efx_rc_t
rhead_tx_qpace(__in efx_txq_t * etp,__in unsigned int ns)109 rhead_tx_qpace(
110 __in efx_txq_t *etp,
111 __in unsigned int ns)
112 {
113 _NOTE(ARGUNUSED(etp))
114 _NOTE(ARGUNUSED(ns))
115
116 /* FIXME Implement the method for Riverhead */
117
118 return (ENOTSUP);
119 }
120
121 __checkReturn efx_rc_t
rhead_tx_qflush(__in efx_txq_t * etp)122 rhead_tx_qflush(
123 __in efx_txq_t *etp)
124 {
125 efx_nic_t *enp = etp->et_enp;
126 efx_rc_t rc;
127
128 if ((rc = efx_mcdi_fini_txq(enp, etp->et_index)) != 0)
129 goto fail1;
130
131 return (0);
132
133 fail1:
134 /*
135 * EALREADY is not an error, but indicates that the MC has rebooted and
136 * that the TXQ has already been destroyed. Callers need to know that
137 * the TXQ flush has completed to avoid waiting until timeout for a
138 * flush done event that will not be delivered.
139 */
140 if (rc != EALREADY)
141 EFSYS_PROBE1(fail1, efx_rc_t, rc);
142
143 return (rc);
144 }
145
146 void
rhead_tx_qenable(__in efx_txq_t * etp)147 rhead_tx_qenable(
148 __in efx_txq_t *etp)
149 {
150 _NOTE(ARGUNUSED(etp))
151 /* Nothing to do here */
152 }
153
154 __checkReturn efx_rc_t
rhead_tx_qdesc_post(__in efx_txq_t * etp,__in_ecount (ndescs)efx_desc_t * ed,__in unsigned int ndescs,__in unsigned int completed,__inout unsigned int * addedp)155 rhead_tx_qdesc_post(
156 __in efx_txq_t *etp,
157 __in_ecount(ndescs) efx_desc_t *ed,
158 __in unsigned int ndescs,
159 __in unsigned int completed,
160 __inout unsigned int *addedp)
161 {
162 _NOTE(ARGUNUSED(etp))
163 _NOTE(ARGUNUSED(ed))
164 _NOTE(ARGUNUSED(ndescs))
165 _NOTE(ARGUNUSED(completed))
166 _NOTE(ARGUNUSED(addedp))
167
168 /* FIXME Implement the method for Riverhead */
169
170 return (ENOTSUP);
171 }
172
173 #if EFSYS_OPT_QSTATS
174
175 void
rhead_tx_qstats_update(__in efx_txq_t * etp,__inout_ecount (TX_NQSTATS)efsys_stat_t * stat)176 rhead_tx_qstats_update(
177 __in efx_txq_t *etp,
178 __inout_ecount(TX_NQSTATS) efsys_stat_t *stat)
179 {
180 unsigned int id;
181
182 for (id = 0; id < TX_NQSTATS; id++) {
183 efsys_stat_t *essp = &stat[id];
184
185 EFSYS_STAT_INCR(essp, etp->et_stat[id]);
186 etp->et_stat[id] = 0;
187 }
188 }
189
190 #endif /* EFSYS_OPT_QSTATS */
191
192 #endif /* EFSYS_OPT_RIVERHEAD */
193