xref: /freebsd/sys/dev/dpaa2/dpaa2_ni.h (revision 061e8e6ba60e10e7d25e45e63d44a54186ed845e)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause
3  *
4  * Copyright © 2021-2022 Dmitry Salychev
5  * Copyright © 2022 Mathew McBride
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  */
28 
29 #ifndef	_DPAA2_NI_H
30 #define	_DPAA2_NI_H
31 
32 #include <sys/rman.h>
33 #include <sys/bus.h>
34 #include <sys/queue.h>
35 #include <sys/taskqueue.h>
36 #include <sys/mbuf.h>
37 #include <sys/param.h>
38 #include <sys/socket.h>
39 #include <sys/buf_ring.h>
40 #include <sys/proc.h>
41 #include <sys/mutex.h>
42 
43 #include <net/if.h>
44 #include <net/ethernet.h>
45 #include <net/if_media.h>
46 
47 #include "dpaa2_types.h"
48 #include "dpaa2_mcp.h"
49 #include "dpaa2_swp.h"
50 #include "dpaa2_io.h"
51 #include "dpaa2_mac.h"
52 #include "dpaa2_ni_dpkg.h"
53 
54 /* Name of the DPAA2 network interface. */
55 #define DPAA2_NI_IFNAME		"dpni"
56 
57 /* Maximum resources per DPNI: 16 DPIOs + 16 DPCONs + 1 DPBP + 1 DPMCP. */
58 #define DPAA2_NI_MAX_RESOURCES	34
59 
60 #define DPAA2_NI_MSI_COUNT	1  /* MSIs per DPNI */
61 #define DPAA2_NI_MAX_CHANNELS	16 /* to distribute ingress traffic to cores */
62 #define DPAA2_NI_MAX_TCS	8  /* traffic classes per DPNI */
63 #define DPAA2_NI_MAX_POOLS	8  /* buffer pools per DPNI */
64 
65 /* Maximum number of Rx buffers. */
66 #define DPAA2_NI_BUFS_INIT	(50u * DPAA2_SWP_BUFS_PER_CMD)
67 #define DPAA2_NI_BUFS_MAX	(1 << 15) /* 15 bits for buffer index max. */
68 
69 /* Maximum number of buffers allocated per Tx ring. */
70 #define DPAA2_NI_BUFS_PER_TX	(1 << 7)
71 #define DPAA2_NI_MAX_BPTX	(1 << 8) /* 8 bits for buffer index max. */
72 
73 /* Number of the DPNI statistics counters. */
74 #define DPAA2_NI_STAT_COUNTERS	7u
75 #define	DPAA2_NI_STAT_SYSCTLS	9u
76 
77 /* Error and status bits in the frame annotation status word. */
78 #define DPAA2_NI_FAS_DISC	0x80000000 /* debug frame */
79 #define DPAA2_NI_FAS_MS		0x40000000 /* MACSEC frame */
80 #define DPAA2_NI_FAS_PTP	0x08000000
81 #define DPAA2_NI_FAS_MC		0x04000000 /* Ethernet multicast frame */
82 #define DPAA2_NI_FAS_BC		0x02000000 /* Ethernet broadcast frame */
83 #define DPAA2_NI_FAS_KSE	0x00040000
84 #define DPAA2_NI_FAS_EOFHE	0x00020000
85 #define DPAA2_NI_FAS_MNLE	0x00010000
86 #define DPAA2_NI_FAS_TIDE	0x00008000
87 #define DPAA2_NI_FAS_PIEE	0x00004000
88 #define DPAA2_NI_FAS_FLE	0x00002000 /* Frame length error */
89 #define DPAA2_NI_FAS_FPE	0x00001000 /* Frame physical error */
90 #define DPAA2_NI_FAS_PTE	0x00000080
91 #define DPAA2_NI_FAS_ISP	0x00000040
92 #define DPAA2_NI_FAS_PHE	0x00000020
93 #define DPAA2_NI_FAS_BLE	0x00000010
94 #define DPAA2_NI_FAS_L3CV	0x00000008 /* L3 csum validation performed */
95 #define DPAA2_NI_FAS_L3CE	0x00000004 /* L3 csum error */
96 #define DPAA2_NI_FAS_L4CV	0x00000002 /* L4 csum validation performed */
97 #define DPAA2_NI_FAS_L4CE	0x00000001 /* L4 csum error */
98 
99 /* Mask for errors on the ingress path. */
100 #define DPAA2_NI_FAS_RX_ERR_MASK (DPAA2_NI_FAS_KSE |	\
101     DPAA2_NI_FAS_EOFHE |				\
102     DPAA2_NI_FAS_MNLE |					\
103     DPAA2_NI_FAS_TIDE |					\
104     DPAA2_NI_FAS_PIEE |					\
105     DPAA2_NI_FAS_FLE |					\
106     DPAA2_NI_FAS_FPE |					\
107     DPAA2_NI_FAS_PTE |					\
108     DPAA2_NI_FAS_ISP |					\
109     DPAA2_NI_FAS_PHE |					\
110     DPAA2_NI_FAS_BLE |					\
111     DPAA2_NI_FAS_L3CE |					\
112     DPAA2_NI_FAS_L4CE					\
113 )
114 
115 /* Option bits to select specific queue configuration options to apply. */
116 #define DPAA2_NI_QUEUE_OPT_USER_CTX	0x00000001
117 #define DPAA2_NI_QUEUE_OPT_DEST		0x00000002
118 #define DPAA2_NI_QUEUE_OPT_FLC		0x00000004
119 #define DPAA2_NI_QUEUE_OPT_HOLD_ACTIVE	0x00000008
120 #define DPAA2_NI_QUEUE_OPT_SET_CGID	0x00000040
121 #define DPAA2_NI_QUEUE_OPT_CLEAR_CGID	0x00000080
122 
123 /* DPNI link configuration options. */
124 #define DPAA2_NI_LINK_OPT_AUTONEG	((uint64_t) 0x01u)
125 #define DPAA2_NI_LINK_OPT_HALF_DUPLEX	((uint64_t) 0x02u)
126 #define DPAA2_NI_LINK_OPT_PAUSE		((uint64_t) 0x04u)
127 #define DPAA2_NI_LINK_OPT_ASYM_PAUSE	((uint64_t) 0x08u)
128 #define DPAA2_NI_LINK_OPT_PFC_PAUSE	((uint64_t) 0x10u)
129 
130 /*
131  * Number of times to retry a frame enqueue before giving up. Value determined
132  * empirically, in order to minimize the number of frames dropped on Tx.
133  */
134 #define DPAA2_NI_ENQUEUE_RETRIES	10
135 
136 enum dpaa2_ni_queue_type {
137 	DPAA2_NI_QUEUE_RX = 0,
138 	DPAA2_NI_QUEUE_TX,
139 	DPAA2_NI_QUEUE_TX_CONF,
140 	DPAA2_NI_QUEUE_RX_ERR
141 };
142 
143 enum dpaa2_ni_dest_type {
144 	DPAA2_NI_DEST_NONE = 0,
145 	DPAA2_NI_DEST_DPIO,
146 	DPAA2_NI_DEST_DPCON
147 };
148 
149 enum dpaa2_ni_ofl_type {
150 	DPAA2_NI_OFL_RX_L3_CSUM = 0,
151 	DPAA2_NI_OFL_RX_L4_CSUM,
152 	DPAA2_NI_OFL_TX_L3_CSUM,
153 	DPAA2_NI_OFL_TX_L4_CSUM,
154 	DPAA2_NI_OFL_FLCTYPE_HASH /* FD flow context for AIOP/CTLU */
155 };
156 
157 /**
158  * @brief DPNI ingress traffic distribution mode.
159  */
160 enum dpaa2_ni_dist_mode {
161 	DPAA2_NI_DIST_MODE_NONE = 0,
162 	DPAA2_NI_DIST_MODE_HASH,
163 	DPAA2_NI_DIST_MODE_FS
164 };
165 
166 /**
167  * @brief DPNI behavior in case of errors.
168  */
169 enum dpaa2_ni_err_action {
170 	DPAA2_NI_ERR_DISCARD = 0,
171 	DPAA2_NI_ERR_CONTINUE,
172 	DPAA2_NI_ERR_SEND_TO_ERROR_QUEUE
173 };
174 
175 struct dpaa2_ni_channel;
176 struct dpaa2_ni_fq;
177 
178 /**
179  * @brief Attributes of the DPNI object.
180  *
181  * options:	 ...
182  * wriop_ver:	 Revision of the underlying WRIOP hardware block.
183  */
184 struct dpaa2_ni_attr {
185 	uint32_t		 options;
186 	uint16_t		 wriop_ver;
187 	struct {
188 		uint16_t	 fs;
189 		uint8_t		 mac;
190 		uint8_t		 vlan;
191 		uint8_t		 qos;
192 	} entries;
193 	struct {
194 		uint8_t		 queues;
195 		uint8_t		 rx_tcs;
196 		uint8_t		 tx_tcs;
197 		uint8_t		 channels;
198 		uint8_t		 cgs;
199 	} num;
200 	struct {
201 		uint8_t		 fs;
202 		uint8_t		 qos;
203 	} key_size;
204 };
205 
206 /**
207  * @brief Tx ring.
208  *
209  * fq:		Parent (TxConf) frame queue.
210  * fqid:	ID of the logical Tx queue.
211  * mbuf_br:	Ring buffer for mbufs to transmit.
212  * mbuf_lock:	Lock for the ring buffer.
213  */
214 struct dpaa2_ni_tx_ring {
215 	struct dpaa2_ni_fq	*fq;
216 	uint32_t		 fqid;
217 	uint32_t		 txid; /* Tx ring index */
218 
219 	/* Ring buffer for indexes in "buf" array. */
220 	struct buf_ring		*idx_br;
221 	struct mtx		 lock;
222 
223 	/* Buffers to DMA load/unload Tx mbufs. */
224 	struct dpaa2_buf	 buf[DPAA2_NI_BUFS_PER_TX];
225 };
226 
227 /**
228  * @brief A Frame Queue is the basic queuing structure used by the QMan.
229  *
230  * It comprises a list of frame descriptors (FDs), so it can be thought of
231  * as a queue of frames.
232  *
233  * NOTE: When frames on a FQ are ready to be processed, the FQ is enqueued
234  *	 onto a work queue (WQ).
235  *
236  * fqid:	Frame queue ID, can be used to enqueue/dequeue or execute other
237  *		commands on the queue through DPIO.
238  * txq_n:	Number of configured Tx queues.
239  * tx_fqid:	Frame queue IDs of the Tx queues which belong to the same flowid.
240  *		Note that Tx queues are logical queues and not all management
241  *		commands are available on these queue types.
242  * qdbin:	Queue destination bin. Can be used with the DPIO enqueue
243  *		operation based on QDID, QDBIN and QPRI. Note that all Tx queues
244  *		with the same flowid have the same destination bin.
245  */
246 struct dpaa2_ni_fq {
247 	int (*consume)(struct dpaa2_ni_channel *,
248 	    struct dpaa2_ni_fq *, struct dpaa2_fd *);
249 
250 	struct dpaa2_ni_channel	*chan;
251 	uint32_t		 fqid;
252 	uint16_t		 flowid;
253 	uint8_t			 tc;
254 	enum dpaa2_ni_queue_type type;
255 
256 	/* Optional fields (for TxConf queue). */
257 	struct dpaa2_ni_tx_ring	 tx_rings[DPAA2_NI_MAX_TCS];
258 	uint32_t		 tx_qdbin;
259 } __aligned(CACHE_LINE_SIZE);
260 
261 /**
262  * @brief QBMan channel to process ingress traffic (Rx, Tx conf).
263  *
264  * NOTE: Several WQs are organized into a single WQ Channel.
265  */
266 struct dpaa2_ni_channel {
267 	device_t		 ni_dev;
268 	device_t		 io_dev;
269 	device_t		 con_dev;
270 	uint16_t		 id;
271 	uint16_t		 flowid;
272 
273 	/* For debug purposes only! */
274 	uint64_t		 tx_frames;
275 	uint64_t		 tx_dropped;
276 
277 	/* Context to configure CDAN. */
278 	struct dpaa2_io_notif_ctx ctx;
279 
280 	/* Channel storage (to keep responses from VDQ command). */
281 	struct dpaa2_buf	 store;
282 	uint32_t		 store_sz; /* in frames */
283 	uint32_t		 store_idx; /* frame index */
284 
285 	/* Recycled buffers to release back to the pool. */
286 	uint32_t		 recycled_n;
287 	bus_addr_t		 recycled[DPAA2_SWP_BUFS_PER_CMD];
288 
289 	/* Frame queues */
290 	uint32_t		 rxq_n;
291 	struct dpaa2_ni_fq	 rx_queues[DPAA2_NI_MAX_TCS];
292 	struct dpaa2_ni_fq	 txc_queue;
293 };
294 
295 /**
296  * @brief Configuration of the network interface queue.
297  *
298  * NOTE: This configuration is used to obtain information of a queue by
299  *	 DPNI_GET_QUEUE command and update it by DPNI_SET_QUEUE one.
300  *
301  * It includes binding of the queue to a DPIO or DPCON object to receive
302  * notifications and traffic on the CPU.
303  *
304  * user_ctx:	(r/w) User defined data, presented along with the frames
305  *		being dequeued from this queue.
306  * flow_ctx:	(r/w) Set default FLC value for traffic dequeued from this queue.
307  *		Please check description of FD structure for more information.
308  *		Note that FLC values set using DPNI_ADD_FS_ENTRY, if any, take
309  *		precedence over values per queue.
310  * dest_id:	(r/w) The ID of a DPIO or DPCON object, depending on
311  *		DEST_TYPE (in flags) value. This field is ignored for DEST_TYPE
312  *		set to 0 (DPNI_DEST_NONE).
313  * fqid:	(r) Frame queue ID, can be used to enqueue/dequeue or execute
314  *		other commands on the queue through DPIO. Note that Tx queues
315  *		are logical queues and not all management commands are available
316  *		on these queue types.
317  * qdbin:	(r) Queue destination bin. Can be used with the DPIO enqueue
318  *		operation based on QDID, QDBIN and QPRI.
319  * type:	Type of the queue to set configuration to.
320  * tc:		Traffic class. Ignored for QUEUE_TYPE 2 and 3 (Tx confirmation
321  *		and Rx error queues).
322  * idx:		Selects a specific queue out of the set of queues in a TC.
323  *		Accepted values are in range 0 to NUM_QUEUES–1. This field is
324  *		ignored for QUEUE_TYPE 3 (Rx error queue). For access to the
325  *		shared Tx confirmation queue (for Tx confirmation mode 1), this
326  *		field must be set to 0xff.
327  * cgid:	(r/w) Congestion group ID.
328  * chan_id:	(w) Channel index to be configured. Used only when QUEUE_TYPE is
329  *		set to DPNI_QUEUE_TX.
330  * priority:	(r/w) Sets the priority in the destination DPCON or DPIO for
331  *		dequeued traffic. Supported values are 0 to # of priorities in
332  *		destination DPCON or DPIO - 1. This field is ignored for
333  *		DEST_TYPE set to 0 (DPNI_DEST_NONE), except if this DPNI is in
334  *		AIOP context. In that case the DPNI_SET_QUEUE can be used to
335  *		override the default assigned priority of the FQ from the TC.
336  * options:	Option bits selecting specific configuration options to apply.
337  *		See DPAA2_NI_QUEUE_OPT_* for details.
338  * dest_type:	Type of destination for dequeued traffic.
339  * cgid_valid:	(r) Congestion group ID is valid.
340  * stash_control: (r/w) If true, lowest 6 bits of FLC are used for stash control.
341  *		Please check description of FD structure for more information.
342  * hold_active:	(r/w) If true, this flag prevents the queue from being
343  *		rescheduled between DPIOs while it carries traffic and is active
344  *		on one DPIO. Can help reduce reordering if one queue is services
345  *		on multiple CPUs, but the queue is also more likely to be trapped
346  *		in one DPIO, especially when congested.
347  */
348 struct dpaa2_ni_queue_cfg {
349 	uint64_t		 user_ctx;
350 	uint64_t		 flow_ctx;
351 	uint32_t		 dest_id;
352 	uint32_t		 fqid;
353 	uint16_t		 qdbin;
354 	enum dpaa2_ni_queue_type type;
355 	uint8_t			 tc;
356 	uint8_t			 idx;
357 	uint8_t			 cgid;
358 	uint8_t			 chan_id;
359 	uint8_t			 priority;
360 	uint8_t			 options;
361 
362 	enum dpaa2_ni_dest_type	 dest_type;
363 	bool			 cgid_valid;
364 	bool			 stash_control;
365 	bool			 hold_active;
366 };
367 
368 /**
369  * @brief Buffer layout attributes.
370  *
371  * pd_size:		Size kept for private data (in bytes).
372  * fd_align:		Frame data alignment.
373  * head_size:		Data head room.
374  * tail_size:		Data tail room.
375  * options:		...
376  * pass_timestamp:	Timestamp is included in the buffer layout.
377  * pass_parser_result:	Parsing results are included in the buffer layout.
378  * pass_frame_status:	Frame status is included in the buffer layout.
379  * pass_sw_opaque:	SW annotation is activated.
380  * queue_type:		Type of a queue this configuration applies to.
381  */
382 struct dpaa2_ni_buf_layout {
383 	uint16_t	pd_size;
384 	uint16_t	fd_align;
385 	uint16_t	head_size;
386 	uint16_t	tail_size;
387 	uint16_t	options;
388 	bool		pass_timestamp;
389 	bool		pass_parser_result;
390 	bool		pass_frame_status;
391 	bool		pass_sw_opaque;
392 	enum dpaa2_ni_queue_type queue_type;
393 };
394 
395 /**
396  * @brief Buffer pools configuration for a network interface.
397  */
398 struct dpaa2_ni_pools_cfg {
399 	uint8_t		pools_num;
400 	struct {
401 		uint32_t bp_obj_id;
402 		uint16_t buf_sz;
403 		int	 backup_flag; /* 0 - regular pool, 1 - backup pool */
404 	} pools[DPAA2_NI_MAX_POOLS];
405 };
406 
407 /**
408  * @brief Errors behavior configuration for a network interface.
409  *
410  * err_mask:		The errors mask to configure.
411  * action:		Desired action for the errors selected in the mask.
412  * set_err_fas:		Set to true to mark the errors in frame annotation
413  * 			status (FAS); relevant for non-discard actions only.
414  */
415 struct dpaa2_ni_err_cfg {
416 	uint32_t	err_mask;
417 	enum dpaa2_ni_err_action action;
418 	bool		set_err_fas;
419 };
420 
421 /**
422  * @brief Link configuration.
423  *
424  * options:	Mask of available options.
425  * adv_speeds:	Speeds that are advertised for autoneg.
426  * rate:	Rate in Mbps.
427  */
428 struct dpaa2_ni_link_cfg {
429 	uint64_t	options;
430 	uint64_t	adv_speeds;
431 	uint32_t	rate;
432 };
433 
434 /**
435  * @brief Link state.
436  *
437  * options:	Mask of available options.
438  * adv_speeds:	Speeds that are advertised for autoneg.
439  * sup_speeds:	Speeds capability of the PHY.
440  * rate:	Rate in Mbps.
441  * link_up:	Link state (true if link is up, false otherwise).
442  * state_valid:	Ignore/Update the state of the link.
443  */
444 struct dpaa2_ni_link_state {
445 	uint64_t	options;
446 	uint64_t	adv_speeds;
447 	uint64_t	sup_speeds;
448 	uint32_t	rate;
449 	bool		link_up;
450 	bool		state_valid;
451 };
452 
453 /**
454  * @brief QoS table configuration.
455  *
456  * kcfg_busaddr:	Address of the buffer in I/O virtual address space which
457  *			holds the QoS table key configuration.
458  * default_tc:		Default traffic class to use in case of a lookup miss in
459  *			the QoS table.
460  * discard_on_miss:	Set to true to discard frames in case of no match.
461  *			Default traffic class will be used otherwise.
462  * keep_entries:	Set to true to keep existing QoS table entries. This
463  *			option will work properly only for DPNI objects created
464  *			with DPNI_OPT_HAS_KEY_MASKING option.
465  */
466 struct dpaa2_ni_qos_table {
467 	uint64_t	kcfg_busaddr;
468 	uint8_t		default_tc;
469 	bool		discard_on_miss;
470 	bool		keep_entries;
471 };
472 
473 /**
474  * @brief Context to add multicast physical addresses to the filter table.
475  *
476  * ifp:		Network interface associated with the context.
477  * error:	Result of the last MC command.
478  * nent:	Number of entries added.
479  */
480 struct dpaa2_ni_mcaddr_ctx {
481 	struct ifnet	*ifp;
482 	int		 error;
483 	int		 nent;
484 };
485 
486 struct dpaa2_eth_dist_fields {
487 	uint64_t	rxnfc_field;
488 	enum net_prot	cls_prot;
489 	int		cls_field;
490 	int		size;
491 	uint64_t	id;
492 };
493 
494 struct dpni_mask_cfg {
495 	uint8_t		mask;
496 	uint8_t		offset;
497 } __packed;
498 
499 struct dpni_dist_extract {
500 	uint8_t		prot;
501 	uint8_t		efh_type; /* EFH type is in the 4 LSBs. */
502 	uint8_t		size;
503 	uint8_t		offset;
504 	uint32_t	field;
505 	uint8_t		hdr_index;
506 	uint8_t		constant;
507 	uint8_t		num_of_repeats;
508 	uint8_t		num_of_byte_masks;
509 	uint8_t		extract_type; /* Extraction type is in the 4 LSBs */
510 	uint8_t		_reserved[3];
511 	struct dpni_mask_cfg masks[4];
512 } __packed;
513 
514 struct dpni_ext_set_rx_tc_dist {
515 	uint8_t		num_extracts;
516 	uint8_t		_reserved[7];
517 	struct dpni_dist_extract extracts[DPKG_MAX_NUM_OF_EXTRACTS];
518 } __packed;
519 
520 /**
521  * @brief Software context for the DPAA2 Network Interface driver.
522  */
523 struct dpaa2_ni_softc {
524 	device_t		 dev;
525 	struct resource 	*res[DPAA2_NI_MAX_RESOURCES];
526 	uint16_t		 api_major;
527 	uint16_t		 api_minor;
528 	uint64_t		 rx_hash_fields;
529 	uint16_t		 tx_data_off;
530 	uint16_t		 tx_qdid;
531 	uint32_t		 link_options;
532 	int			 link_state;
533 
534 	uint16_t		 buf_align;
535 	uint16_t		 buf_sz;
536 
537 	/* For debug purposes only! */
538 	uint64_t		 rx_anomaly_frames;
539 	uint64_t		 rx_single_buf_frames;
540 	uint64_t		 rx_sg_buf_frames;
541 	uint64_t		 rx_enq_rej_frames;
542 	uint64_t		 rx_ieoi_err_frames;
543 	uint64_t		 tx_single_buf_frames;
544 	uint64_t		 tx_sg_frames;
545 
546 	/* Attributes of the DPAA2 network interface. */
547 	struct dpaa2_ni_attr	 attr;
548 
549 	/* For network interface and miibus. */
550 	struct ifnet		*ifp;
551 	uint32_t		 if_flags;
552 	struct mtx		 lock;
553 	device_t		 miibus;
554 	struct mii_data		*mii;
555 	boolean_t		 fixed_link;
556 	struct ifmedia		 fixed_ifmedia;
557 	int			 media_status;
558 
559 	/* DMA resources */
560 	bus_dma_tag_t		 bp_dmat;  /* for buffer pool */
561 	bus_dma_tag_t		 tx_dmat;  /* for Tx buffers */
562 	bus_dma_tag_t		 st_dmat;  /* for channel storage */
563 	bus_dma_tag_t		 rxd_dmat; /* for Rx distribution key */
564 	bus_dma_tag_t		 qos_dmat; /* for QoS table key */
565 	bus_dma_tag_t		 sgt_dmat; /* for scatter/gather tables */
566 
567 	struct dpaa2_buf	 qos_kcfg; /* QoS table key config. */
568 	struct dpaa2_buf	 rxd_kcfg; /* Rx distribution key config. */
569 
570 	/* Channels and RxError frame queue */
571 	uint32_t		 chan_n;
572 	struct dpaa2_ni_channel	*channels[DPAA2_NI_MAX_CHANNELS];
573 	struct dpaa2_ni_fq	 rxe_queue; /* one per network interface */
574 
575 	/* Rx buffers for buffer pool. */
576 	struct dpaa2_atomic	 buf_num;
577 	struct dpaa2_atomic	 buf_free; /* for sysctl(9) only */
578 	struct dpaa2_buf	 buf[DPAA2_NI_BUFS_MAX];
579 
580 	/* Interrupts */
581 	int			 irq_rid[DPAA2_NI_MSI_COUNT];
582 	struct resource		*irq_res;
583 	void			*intr; /* interrupt handle */
584 
585 	/* Tasks */
586 	struct taskqueue	*bp_taskq;
587 	struct task		 bp_task;
588 
589 	/* Callouts */
590 	struct callout		 mii_callout;
591 
592 	struct {
593 		uint32_t	 dpmac_id;
594 		uint8_t		 addr[ETHER_ADDR_LEN];
595 		device_t	 phy_dev;
596 		int		 phy_loc;
597 	} mac; /* Info about connected DPMAC (if exists). */
598 };
599 
600 extern struct resource_spec dpaa2_ni_spec[];
601 
602 #endif /* _DPAA2_NI_H */
603