1300113Sscottl#
2300113Sscottl# Copyright (c) 2014, Matthew Macy (kmacy@freebsd.org)
3300113Sscottl# All rights reserved.
4300113Sscottl#
5300113Sscottl# Redistribution and use in source and binary forms, with or without
6300113Sscottl# modification, are permitted provided that the following conditions are met:
7300113Sscottl#
8300113Sscottl#  1. Redistributions of source code must retain the above copyright notice,
9300113Sscottl#     this list of conditions and the following disclaimer.
10300113Sscottl#
11300113Sscottl#  2. Neither the name of Matthew Macy nor the names of its
12300113Sscottl#     contributors may be used to endorse or promote products derived from
13300113Sscottl#     this software without specific prior written permission.
14300113Sscottl#
15300113Sscottl# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16300113Sscottl# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17300113Sscottl# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18300113Sscottl# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19300113Sscottl# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20300113Sscottl# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21300113Sscottl# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22300113Sscottl# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23300113Sscottl# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24300113Sscottl# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25300113Sscottl# POSSIBILITY OF SUCH DAMAGE.
26300113Sscottl#
27300113Sscottl# $FreeBSD: stable/11/sys/net/ifdi_if.m 361055 2020-05-14 20:07:02Z erj $
28300113Sscottl#
29300113Sscottl
30300113Sscottl#include <sys/types.h>
31300113Sscottl#include <sys/systm.h>
32300113Sscottl#include <sys/socket.h>
33300113Sscottl
34300113Sscottl#include <machine/bus.h>
35300113Sscottl#include <sys/bus.h>
36300113Sscottl
37300113Sscottl#include <net/ethernet.h>
38300113Sscottl#include <net/if.h>
39300113Sscottl#include <net/if_var.h>
40300113Sscottl#include <net/if_media.h>
41300113Sscottl#include <net/iflib.h>
42300113Sscottl
43300113SscottlINTERFACE ifdi;
44300113Sscottl
45300113SscottlCODE {
46300113Sscottl
47300113Sscottl	static void
48300113Sscottl	null_void_op(if_ctx_t _ctx __unused)
49300113Sscottl	{
50300113Sscottl	}
51300113Sscottl
52300113Sscottl	static void
53300113Sscottl	null_timer_op(if_ctx_t _ctx __unused, uint16_t _qsidx __unused)
54300113Sscottl	{
55300113Sscottl	}
56300113Sscottl
57300113Sscottl	static int
58300113Sscottl	null_int_op(if_ctx_t _ctx __unused)
59300113Sscottl	{
60300113Sscottl		return (0);
61300113Sscottl	}
62300113Sscottl
63304704Sshurd	static int
64300113Sscottl	null_queue_intr_enable(if_ctx_t _ctx __unused, uint16_t _qid __unused)
65300113Sscottl	{
66304704Sshurd		return (ENOTSUP);
67300113Sscottl	}
68300113Sscottl
69300113Sscottl	static void
70300113Sscottl	null_led_func(if_ctx_t _ctx __unused, int _onoff __unused)
71300113Sscottl	{
72300113Sscottl	}
73300113Sscottl
74300113Sscottl	static void
75300113Sscottl	null_vlan_register_op(if_ctx_t _ctx __unused, uint16_t vtag __unused)
76300113Sscottl	{
77300113Sscottl	}
78300113Sscottl
79300113Sscottl	static int
80300113Sscottl	null_q_setup(if_ctx_t _ctx __unused, uint32_t _qid __unused)
81300113Sscottl	{
82300113Sscottl		return (0);
83300113Sscottl	}
84300113Sscottl
85300113Sscottl	static int
86300113Sscottl	null_i2c_req(if_ctx_t _sctx __unused, struct ifi2creq *_i2c __unused)
87300113Sscottl	{
88300113Sscottl		return (ENOTSUP);
89300113Sscottl	}
90300113Sscottl
91300113Sscottl	static int
92300113Sscottl	null_sysctl_int_delay(if_ctx_t _sctx __unused, if_int_delay_info_t _iidi __unused)
93300113Sscottl	{
94300113Sscottl		return (0);
95300113Sscottl	}
96300113Sscottl
97300113Sscottl	static int
98300113Sscottl	null_iov_init(if_ctx_t _ctx __unused, uint16_t num_vfs __unused, const nvlist_t *params __unused)
99300113Sscottl	{
100300113Sscottl		return (ENOTSUP);
101300113Sscottl	}
102300113Sscottl
103300113Sscottl	static int
104300113Sscottl	null_vf_add(if_ctx_t _ctx __unused, uint16_t num_vfs __unused, const nvlist_t *params __unused)
105300113Sscottl	{
106300113Sscottl		return (ENOTSUP);
107300113Sscottl	}
108300113Sscottl
109300113Sscottl	static int
110300113Sscottl	null_priv_ioctl(if_ctx_t _ctx __unused, u_long command, caddr_t *data __unused)
111300113Sscottl	{
112300113Sscottl		return (ENOTSUP);
113300113Sscottl	}
114361055Serj
115361055Serj	static bool
116361055Serj	null_needs_restart(if_ctx_t _ctx __unused, enum iflib_restart_event _event __unused)
117361055Serj	{
118361055Serj		return (true);
119361055Serj	}
120300113Sscottl};
121300113Sscottl
122300113Sscottl#
123300113Sscottl# bus interfaces
124300113Sscottl#
125300113Sscottl
126300113SscottlMETHOD int attach_pre {
127300113Sscottl	if_ctx_t _ctx;
128300113Sscottl};
129300113Sscottl
130300113SscottlMETHOD int attach_post {
131300113Sscottl	if_ctx_t _ctx;
132300113Sscottl};
133300113Sscottl
134300113SscottlMETHOD int detach {
135300113Sscottl	if_ctx_t _ctx;
136300113Sscottl};
137300113Sscottl
138300113SscottlMETHOD int suspend {
139300113Sscottl	if_ctx_t _ctx;
140300113Sscottl} DEFAULT null_int_op;
141300113Sscottl
142300113SscottlMETHOD int shutdown {
143300113Sscottl	if_ctx_t _ctx;
144300113Sscottl} DEFAULT null_int_op;
145300113Sscottl
146300113SscottlMETHOD int resume {
147300113Sscottl	if_ctx_t _ctx;
148300113Sscottl} DEFAULT null_int_op;
149300113Sscottl
150300113Sscottl#
151300113Sscottl# downcall to driver to allocate its
152300113Sscottl# own queue state and tie it to the parent
153300113Sscottl#
154300113Sscottl
155300113SscottlMETHOD int tx_queues_alloc {
156300113Sscottl	if_ctx_t _ctx;
157300113Sscottl	caddr_t *_vaddrs;
158300113Sscottl	uint64_t *_paddrs;
159300113Sscottl	int ntxqs;
160300113Sscottl	int ntxqsets;
161300113Sscottl};
162300113Sscottl
163300113SscottlMETHOD int rx_queues_alloc {
164300113Sscottl	if_ctx_t _ctx;
165300113Sscottl	caddr_t *_vaddrs;
166300113Sscottl	uint64_t *_paddrs;
167300113Sscottl	int nrxqs;
168300113Sscottl	int nrxqsets;
169300113Sscottl};
170300113Sscottl
171300113SscottlMETHOD void queues_free {
172300113Sscottl	if_ctx_t _ctx;
173300113Sscottl};
174300113Sscottl
175300113Sscottl#
176300113Sscottl# interface reset / stop
177300113Sscottl#
178300113Sscottl
179300113SscottlMETHOD void init {
180300113Sscottl	if_ctx_t _ctx;
181300113Sscottl};
182300113Sscottl
183300113SscottlMETHOD void stop {
184300113Sscottl	if_ctx_t _ctx;
185300113Sscottl};
186300113Sscottl
187300113Sscottl#
188300113Sscottl# interrupt setup and manipulation
189300113Sscottl#
190300113Sscottl
191300113SscottlMETHOD int msix_intr_assign {
192300113Sscottl	if_ctx_t _sctx;
193300113Sscottl	int msix;
194300113Sscottl};
195300113Sscottl
196300113SscottlMETHOD void intr_enable {
197300113Sscottl	if_ctx_t _ctx;
198300113Sscottl};
199300113Sscottl
200300113SscottlMETHOD void intr_disable {
201300113Sscottl	if_ctx_t _ctx;
202300113Sscottl};
203300113Sscottl
204333338SshurdMETHOD int rx_queue_intr_enable {
205300113Sscottl	if_ctx_t _ctx;
206300113Sscottl	uint16_t _qid;
207300113Sscottl} DEFAULT null_queue_intr_enable;
208300113Sscottl
209333338SshurdMETHOD int tx_queue_intr_enable {
210333338Sshurd	if_ctx_t _ctx;
211333338Sshurd	uint16_t _qid;
212333338Sshurd} DEFAULT null_queue_intr_enable;
213333338Sshurd
214300113SscottlMETHOD void link_intr_enable {
215300113Sscottl	if_ctx_t _ctx;
216300113Sscottl} DEFAULT null_void_op;
217300113Sscottl
218300113Sscottl#
219300113Sscottl# interface configuration
220300113Sscottl#
221300113Sscottl
222300113SscottlMETHOD void multi_set {
223300113Sscottl	if_ctx_t _ctx;
224300113Sscottl};
225300113Sscottl
226300113SscottlMETHOD int mtu_set {
227300113Sscottl	if_ctx_t _ctx;
228300113Sscottl	uint32_t _mtu;
229300113Sscottl};
230300113Sscottl
231300113SscottlMETHOD void media_set{
232300113Sscottl	if_ctx_t _ctx;
233300113Sscottl} DEFAULT null_void_op;
234300113Sscottl
235300113SscottlMETHOD int promisc_set {
236300113Sscottl	if_ctx_t _ctx;
237300113Sscottl	int _flags;
238300113Sscottl};
239300113Sscottl
240300113SscottlMETHOD void crcstrip_set {
241300113Sscottl	if_ctx_t _ctx;
242300113Sscottl	int _onoff;
243333338Sshurd	int _strip;
244300113Sscottl};
245300113Sscottl
246300113Sscottl#
247300113Sscottl# IOV handling
248300113Sscottl#
249300113Sscottl
250300113SscottlMETHOD void vflr_handle {
251300113Sscottl	if_ctx_t _ctx;
252300113Sscottl} DEFAULT null_void_op;
253300113Sscottl
254300113SscottlMETHOD int iov_init {
255300113Sscottl	if_ctx_t _ctx;
256300113Sscottl	uint16_t num_vfs;
257300113Sscottl	const nvlist_t * params;
258300113Sscottl} DEFAULT null_iov_init;
259300113Sscottl
260300113SscottlMETHOD void iov_uninit {
261300113Sscottl	if_ctx_t _ctx;
262300113Sscottl} DEFAULT null_void_op;
263300113Sscottl
264300113SscottlMETHOD int iov_vf_add {
265300113Sscottl	if_ctx_t _ctx;
266300113Sscottl	uint16_t num_vfs;
267300113Sscottl	const nvlist_t * params;
268300113Sscottl} DEFAULT null_vf_add;
269300113Sscottl
270300113Sscottl
271300113Sscottl#
272300113Sscottl# Device status
273300113Sscottl#
274300113Sscottl
275300113SscottlMETHOD void update_admin_status {
276300113Sscottl	if_ctx_t _ctx;
277300113Sscottl};
278300113Sscottl
279300113SscottlMETHOD void media_status {
280300113Sscottl	if_ctx_t _ctx;
281300113Sscottl	struct ifmediareq *_ifm;
282300113Sscottl};
283300113Sscottl
284300113SscottlMETHOD int media_change {
285300113Sscottl	if_ctx_t _ctx;
286300113Sscottl};
287300113Sscottl
288300113SscottlMETHOD uint64_t get_counter {
289300113Sscottl	if_ctx_t _ctx;
290300113Sscottl	ift_counter cnt;
291300113Sscottl};
292300113Sscottl
293300113SscottlMETHOD int priv_ioctl {
294300113Sscottl	if_ctx_t _ctx;
295300113Sscottl	u_long   _cmd;
296300113Sscottl	caddr_t _data;
297300113Sscottl} DEFAULT null_priv_ioctl;
298300113Sscottl
299300113Sscottl#
300300113Sscottl# optional methods
301300113Sscottl#
302300113Sscottl
303300113SscottlMETHOD int i2c_req {
304300113Sscottl	if_ctx_t _ctx;
305300113Sscottl	struct ifi2creq *_req;
306300113Sscottl} DEFAULT null_i2c_req;
307300113Sscottl
308300113SscottlMETHOD int txq_setup {
309300113Sscottl	if_ctx_t _ctx;
310300113Sscottl	uint32_t _txqid;
311300113Sscottl} DEFAULT null_q_setup;
312300113Sscottl
313300113SscottlMETHOD int rxq_setup {
314300113Sscottl	if_ctx_t _ctx;
315300113Sscottl	uint32_t _txqid;
316300113Sscottl} DEFAULT null_q_setup;
317300113Sscottl
318300113SscottlMETHOD void timer {
319300113Sscottl	if_ctx_t _ctx;
320300113Sscottl	uint16_t _txqid;
321300113Sscottl} DEFAULT null_timer_op;
322300113Sscottl
323300113SscottlMETHOD void watchdog_reset {
324300113Sscottl	if_ctx_t _ctx;
325300113Sscottl} DEFAULT null_void_op;
326300113Sscottl
327300113SscottlMETHOD void led_func {
328300113Sscottl	if_ctx_t _ctx;
329300113Sscottl	int _onoff;
330300113Sscottl} DEFAULT null_led_func;
331300113Sscottl
332300113SscottlMETHOD void vlan_register {
333300113Sscottl	if_ctx_t _ctx;
334300113Sscottl	uint16_t _vtag;
335300113Sscottl} DEFAULT null_vlan_register_op;
336300113Sscottl
337300113SscottlMETHOD void vlan_unregister {
338300113Sscottl	if_ctx_t _ctx;
339300113Sscottl	uint16_t _vtag;
340300113Sscottl} DEFAULT null_vlan_register_op;
341300113Sscottl
342300113SscottlMETHOD int sysctl_int_delay {
343300113Sscottl	if_ctx_t _sctx;
344300113Sscottl	if_int_delay_info_t _iidi;
345300113Sscottl} DEFAULT null_sysctl_int_delay;
346300113Sscottl
347333338SshurdMETHOD void debug {
348333338Sshurd	if_ctx_t _ctx;
349333338Sshurd} DEFAULT null_void_op;
350361055Serj
351361055SerjMETHOD bool needs_restart {
352361055Serj	if_ctx_t _ctx;
353361055Serj	enum iflib_restart_event _event;
354361055Serj} DEFAULT null_needs_restart;
355