zfs: merge openzfs/zfs@86e115e21
[freebsd.git] / sys / net / ifdi_if.m
1 #
2 # Copyright (c) 2014, Matthew Macy (mmacy@mattmacy.io)
3 # All rights reserved.
4 #
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions are met:
7 #
8 #  1. Redistributions of source code must retain the above copyright notice,
9 #     this list of conditions and the following disclaimer.
10 #
11 #  2. Neither the name of Matthew Macy nor the names of its
12 #     contributors may be used to endorse or promote products derived from
13 #     this software without specific prior written permission.
14 #
15 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 # POSSIBILITY OF SUCH DAMAGE.
26 #
27 #
28
29 #include <sys/types.h>
30 #include <sys/systm.h>
31 #include <sys/socket.h>
32
33 #include <machine/bus.h>
34 #include <sys/bus.h>
35
36 #include <net/ethernet.h>
37 #include <net/if.h>
38 #include <net/if_var.h>
39 #include <net/if_media.h>
40 #include <net/iflib.h>
41 #include <net/if_private.h>
42
43 INTERFACE ifdi;
44
45 CODE {
46
47         static void
48         null_void_op(if_ctx_t _ctx __unused)
49         {
50         }
51
52         static void
53         null_timer_op(if_ctx_t _ctx __unused, uint16_t _qsidx __unused)
54         {
55         }
56
57         static int
58         null_int_op(if_ctx_t _ctx __unused)
59         {
60                 return (0);
61         }
62
63         static int
64         null_queue_intr_enable(if_ctx_t _ctx __unused, uint16_t _qid __unused)
65         {
66                 return (ENOTSUP);
67         }
68
69         static void
70         null_led_func(if_ctx_t _ctx __unused, int _onoff __unused)
71         {
72         }
73
74         static void
75         null_vlan_register_op(if_ctx_t _ctx __unused, uint16_t vtag __unused)
76         {
77         }
78
79         static int
80         null_q_setup(if_ctx_t _ctx __unused, uint32_t _qid __unused)
81         {
82                 return (0);
83         }
84
85         static int
86         null_i2c_req(if_ctx_t _sctx __unused, struct ifi2creq *_i2c __unused)
87         {
88                 return (ENOTSUP);
89         }
90
91         static int
92         null_sysctl_int_delay(if_ctx_t _sctx __unused, if_int_delay_info_t _iidi __unused)
93         {
94                 return (0);
95         }
96
97         static int
98         null_iov_init(if_ctx_t _ctx __unused, uint16_t num_vfs __unused, const nvlist_t *params __unused)
99         {
100                 return (ENOTSUP);
101         }
102
103         static int
104         null_vf_add(if_ctx_t _ctx __unused, uint16_t num_vfs __unused, const nvlist_t *params __unused)
105         {
106                 return (ENOTSUP);
107         }
108
109         static int
110         null_priv_ioctl(if_ctx_t _ctx __unused, u_long command, caddr_t *data __unused)
111         {
112                 return (ENOTSUP);
113         }
114
115         static bool
116         null_needs_restart(if_ctx_t _ctx __unused, enum iflib_restart_event _event __unused)
117         {
118                 return (false);
119         }
120 };
121
122 #
123 # bus interfaces
124 #
125
126 METHOD int attach_pre {
127         if_ctx_t _ctx;
128 };
129
130 METHOD int attach_post {
131         if_ctx_t _ctx;
132 };
133
134 METHOD int reinit_pre {
135         if_ctx_t _ctx;
136 };
137
138 METHOD int reinit_post {
139         if_ctx_t _ctx;
140 };
141
142 METHOD int detach {
143         if_ctx_t _ctx;
144 };
145
146 METHOD int suspend {
147         if_ctx_t _ctx;
148 } DEFAULT null_int_op;
149
150 METHOD int shutdown {
151         if_ctx_t _ctx;
152 } DEFAULT null_int_op;
153
154 METHOD int resume {
155         if_ctx_t _ctx;
156 } DEFAULT null_int_op;
157
158 #
159 # downcall to driver to allocate its
160 # own queue state and tie it to the parent
161 #
162
163 METHOD int tx_queues_alloc {
164         if_ctx_t _ctx;
165         caddr_t *_vaddrs;
166         uint64_t *_paddrs;
167         int ntxqs;
168         int ntxqsets;
169 };
170
171 METHOD int rx_queues_alloc {
172         if_ctx_t _ctx;
173         caddr_t *_vaddrs;
174         uint64_t *_paddrs;
175         int nrxqs;
176         int nrxqsets;
177 };
178
179 METHOD void queues_free {
180         if_ctx_t _ctx;
181 };
182
183 #
184 # interface reset / stop
185 #
186
187 METHOD void init {
188         if_ctx_t _ctx;
189 };
190
191 METHOD void stop {
192         if_ctx_t _ctx;
193 };
194
195 #
196 # interrupt setup and manipulation
197 #
198
199 METHOD int msix_intr_assign {
200         if_ctx_t _sctx;
201         int msix;
202 };
203
204 METHOD void intr_enable {
205         if_ctx_t _ctx;
206 };
207
208 METHOD void intr_disable {
209         if_ctx_t _ctx;
210 };
211
212 METHOD int rx_queue_intr_enable {
213         if_ctx_t _ctx;
214         uint16_t _qid;
215 } DEFAULT null_queue_intr_enable;
216
217 METHOD int tx_queue_intr_enable {
218         if_ctx_t _ctx;
219         uint16_t _qid;
220 } DEFAULT null_queue_intr_enable;
221
222 METHOD void link_intr_enable {
223         if_ctx_t _ctx;
224 } DEFAULT null_void_op;
225
226 METHOD void admin_completion_handle {
227         if_ctx_t _ctx;
228 } DEFAULT null_void_op;
229
230 #
231 # interface configuration
232 #
233
234 METHOD void multi_set {
235         if_ctx_t _ctx;
236 };
237
238 METHOD int mtu_set {
239         if_ctx_t _ctx;
240         uint32_t _mtu;
241 };
242
243 METHOD void media_set{
244         if_ctx_t _ctx;
245 } DEFAULT null_void_op;
246
247 METHOD int promisc_set {
248         if_ctx_t _ctx;
249         int _flags;
250 };
251
252 METHOD void crcstrip_set {
253         if_ctx_t _ctx;
254         int _onoff;
255         int _strip;
256 };
257
258 #
259 # IOV handling
260 #
261
262 METHOD void vflr_handle {
263         if_ctx_t _ctx;
264 } DEFAULT null_void_op;
265
266 METHOD int iov_init {
267         if_ctx_t _ctx;
268         uint16_t num_vfs;
269         const nvlist_t * params;
270 } DEFAULT null_iov_init;
271
272 METHOD void iov_uninit {
273         if_ctx_t _ctx;
274 } DEFAULT null_void_op;
275
276 METHOD int iov_vf_add {
277         if_ctx_t _ctx;
278         uint16_t num_vfs;
279         const nvlist_t * params;
280 } DEFAULT null_vf_add;
281
282
283 #
284 # Device status
285 #
286
287 METHOD void update_admin_status {
288         if_ctx_t _ctx;
289 };
290
291 METHOD void media_status {
292         if_ctx_t _ctx;
293         struct ifmediareq *_ifm;
294 };
295
296 METHOD int media_change {
297         if_ctx_t _ctx;
298 };
299
300 METHOD uint64_t get_counter {
301         if_ctx_t _ctx;
302         ift_counter cnt;
303 };
304
305 METHOD int priv_ioctl {
306         if_ctx_t _ctx;
307         u_long   _cmd;
308         caddr_t _data;
309 } DEFAULT null_priv_ioctl;
310
311 #
312 # optional methods
313 #
314
315 METHOD int i2c_req {
316         if_ctx_t _ctx;
317         struct ifi2creq *_req;
318 } DEFAULT null_i2c_req;
319
320 METHOD int txq_setup {
321         if_ctx_t _ctx;
322         uint32_t _txqid;
323 } DEFAULT null_q_setup;
324
325 METHOD int rxq_setup {
326         if_ctx_t _ctx;
327         uint32_t _txqid;
328 } DEFAULT null_q_setup;
329
330 METHOD void timer {
331         if_ctx_t _ctx;
332         uint16_t _txqid;
333 } DEFAULT null_timer_op;
334
335 METHOD void watchdog_reset {
336         if_ctx_t _ctx;
337 } DEFAULT null_void_op;
338
339 METHOD void led_func {
340         if_ctx_t _ctx;
341         int _onoff;
342 } DEFAULT null_led_func;
343
344 METHOD void vlan_register {
345         if_ctx_t _ctx;
346         uint16_t _vtag;
347 } DEFAULT null_vlan_register_op;
348
349 METHOD void vlan_unregister {
350         if_ctx_t _ctx;
351         uint16_t _vtag;
352 } DEFAULT null_vlan_register_op;
353
354 METHOD int sysctl_int_delay {
355         if_ctx_t _sctx;
356         if_int_delay_info_t _iidi;
357 } DEFAULT null_sysctl_int_delay;
358
359 METHOD void debug {
360         if_ctx_t _ctx;
361 } DEFAULT null_void_op;
362
363 METHOD bool needs_restart {
364         if_ctx_t _ctx;
365         enum iflib_restart_event _event;
366 } DEFAULT null_needs_restart;