| 1 | /*- |
| 2 | * Copyright (c) 2014-2017, 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 | #ifndef __IFLIB_H_ |
| 28 | #define __IFLIB_H_ |
| 29 | |
| 30 | #include <sys/kobj.h> |
| 31 | #include <sys/bus.h> |
| 32 | #include <sys/cpuset.h> |
| 33 | #include <machine/bus.h> |
| 34 | #include <sys/nv.h> |
| 35 | #include <sys/gtaskqueue.h> |
| 36 | |
| 37 | /* |
| 38 | * The value type for indexing, limits max descriptors |
| 39 | * to 65535 can be conditionally redefined to uint32_t |
| 40 | * in the future if the need arises. |
| 41 | */ |
| 42 | typedef uint16_t qidx_t; |
| 43 | #define QIDX_INVALID 0xFFFF |
| 44 | |
| 45 | struct iflib_ctx; |
| 46 | typedef struct iflib_ctx *if_ctx_t; |
| 47 | struct if_shared_ctx; |
| 48 | typedef const struct if_shared_ctx *if_shared_ctx_t; |
| 49 | struct if_int_delay_info; |
| 50 | typedef struct if_int_delay_info *if_int_delay_info_t; |
| 51 | |
| 52 | /* |
| 53 | * File organization: |
| 54 | * - public structures |
| 55 | * - iflib accessors |
| 56 | * - iflib utility functions |
| 57 | * - iflib core functions |
| 58 | */ |
| 59 | |
| 60 | typedef struct if_rxd_frag { |
| 61 | 	uint8_t irf_flid; |
| 62 | 	qidx_t irf_idx; |
| 63 | 	uint16_t irf_len; |
| 64 | } *if_rxd_frag_t; |
| 65 | |
| 66 | /* bnxt supports 64 with hardware LRO enabled */ |
| 67 | #define IFLIB_MAX_RX_SEGS		64 |
| 68 | |
| 69 | typedef struct if_rxd_info { |
| 70 | 	/* set by iflib */ |
| 71 | 	uint16_t iri_qsidx;		/* qset index */ |
| 72 | 	uint16_t iri_vtag;		/* vlan tag - if flag set */ |
| 73 | 	/* XXX redundant with the new irf_len field */ |
| 74 | 	uint16_t iri_len;		/* packet length */ |
| 75 | 	qidx_t iri_cidx;		/* consumer index of cq */ |
| 76 | 	if_t iri_ifp;			/* driver may have >1 iface per softc */ |
| 77 | |
| 78 | 	/* updated by driver */ |
| 79 | 	if_rxd_frag_t iri_frags; |
| 80 | 	uint32_t iri_flowid;		/* RSS hash for packet */ |
| 81 | 	uint32_t iri_csum_flags;	/* m_pkthdr csum flags */ |
| 82 | |
| 83 | 	uint32_t iri_csum_data;		/* m_pkthdr csum data */ |
| 84 | 	uint8_t iri_flags;		/* mbuf flags for packet */ |
| 85 | 	uint8_t	 iri_nfrags;		/* number of fragments in packet */ |
| 86 | 	uint8_t	 iri_rsstype;		/* RSS hash type */ |
| 87 | 	uint8_t	 iri_pad;		/* any padding in the received data */ |
| 88 | } *if_rxd_info_t; |
| 89 | |
| 90 | typedef struct if_rxd_update { |
| 91 | 	uint64_t	*iru_paddrs; |
| 92 | 	qidx_t		*iru_idxs; |
| 93 | 	qidx_t		iru_pidx; |
| 94 | 	uint16_t	iru_qsidx; |
| 95 | 	uint16_t	iru_count; |
| 96 | 	uint16_t	iru_buf_size; |
| 97 | 	uint8_t		iru_flidx; |
| 98 | } *if_rxd_update_t; |
| 99 | |
| 100 | #define IPI_TX_INTR	0x1		/* send an interrupt when this packet is sent */ |
| 101 | #define IPI_TX_IPV4	0x2		/* ethertype IPv4 */ |
| 102 | #define IPI_TX_IPV6	0x4		/* ethertype IPv6 */ |
| 103 | |
| 104 | typedef struct if_pkt_info { |
| 105 | 	bus_dma_segment_t	*ipi_segs;	/* physical addresses */ |
| 106 | 	uint32_t		ipi_len;	/* packet length */ |
| 107 | 	uint16_t		ipi_qsidx;	/* queue set index */ |
| 108 | 	qidx_t			ipi_nsegs;	/* number of segments */ |
| 109 | |
| 110 | 	qidx_t			ipi_ndescs;	/* number of descriptors used by encap */ |
| 111 | 	uint16_t		ipi_flags;	/* iflib per-packet flags */ |
| 112 | 	qidx_t			ipi_pidx;	/* start pidx for encap */ |
| 113 | 	qidx_t			ipi_new_pidx;	/* next available pidx post-encap */ |
| 114 | 	/* offload handling */ |
| 115 | 	uint8_t			ipi_ehdrlen;	/* ether header length */ |
| 116 | 	uint8_t			ipi_ip_hlen;	/* ip header length */ |
| 117 | 	uint8_t			ipi_tcp_hlen;	/* tcp header length */ |
| 118 | 	uint8_t			ipi_ipproto;	/* ip protocol */ |
| 119 | |
| 120 | 	uint32_t		ipi_csum_flags;	/* packet checksum flags */ |
| 121 | 	uint16_t		ipi_tso_segsz;	/* tso segment size */ |
| 122 | 	uint16_t		ipi_vtag;	/* VLAN tag */ |
| 123 | 	uint16_t		ipi_etype;	/* ether header type */ |
| 124 | 	uint16_t		ipi_tcp_hflags;	/* tcp header flags */ |
| 125 | |
| 126 | 	uint32_t		ipi_tcp_seq;	/* tcp seqno */ |
| 127 | 	uint8_t			ipi_ip_tos;	/* IP ToS field data */ |
| 128 | 	uint8_t			ipi_mflags;	/* packet mbuf flags */ |
| 129 | 	uint8_t			__spare0__; |
| 130 | 	uint8_t		__spare1__; |
| 131 | } *if_pkt_info_t; |
| 132 | |
| 133 | typedef struct if_irq { |
| 134 | 	struct resource *ii_res; |
| 135 | 	int __spare0__; |
| 136 | 	void *ii_tag; |
| 137 | } *if_irq_t; |
| 138 | |
| 139 | struct if_int_delay_info { |
| 140 | 	if_ctx_t iidi_ctx;	/* Back-pointer to the iflib ctx (softc) */ |
| 141 | 	int iidi_offset;			/* Register offset to read/write */ |
| 142 | 	int iidi_value;			/* Current value in usecs */ |
| 143 | 	struct sysctl_oid *iidi_oidp; |
| 144 | 	struct sysctl_req *iidi_req; |
| 145 | }; |
| 146 | |
| 147 | typedef enum { |
| 148 | 	IFLIB_INTR_LEGACY, |
| 149 | 	IFLIB_INTR_MSI, |
| 150 | 	IFLIB_INTR_MSIX |
| 151 | } iflib_intr_mode_t; |
| 152 | |
| 153 | /* |
| 154 | * This really belongs in pciio.h or some place more general |
| 155 | * but this is the only consumer for now. |
| 156 | */ |
| 157 | typedef struct pci_vendor_info { |
| 158 | 	uint32_t	pvi_vendor_id; |
| 159 | 	uint32_t	pvi_device_id; |
| 160 | 	uint32_t	pvi_subvendor_id; |
| 161 | 	uint32_t	pvi_subdevice_id; |
| 162 | 	uint32_t	pvi_rev_id; |
| 163 | 	uint32_t	pvi_class_mask; |
| 164 | 	const char	*pvi_name; |
| 165 | } pci_vendor_info_t; |
| 166 | #define PVID(vendor, devid, name) {vendor, devid, 0, 0, 0, 0, name} |
| 167 | #define PVID_OEM(vendor, devid, svid, sdevid, revid, name) {vendor, devid, svid, sdevid, revid, 0, name} |
| 168 | #define PVID_END {0, 0, 0, 0, 0, 0, NULL} |
| 169 | |
| 170 | /* No drivers in tree currently match on anything except vendor:device. */ |
| 171 | #define IFLIB_PNP_DESCR "U32:vendor;U32:device;U32:#;U32:#;" \ |
| 172 | "U32:#;U32:#;D:#" |
| 173 | #define IFLIB_PNP_INFO(b, u, t) \ |
| 174 | MODULE_PNP_INFO(IFLIB_PNP_DESCR, b, u, t, nitems(t) - 1) |
| 175 | |
| 176 | typedef struct if_txrx { |
| 177 | 	int (*ift_txd_encap) (void *, if_pkt_info_t); |
| 178 | 	void (*ift_txd_flush) (void *, uint16_t, qidx_t pidx); |
| 179 | 	int (*ift_txd_credits_update) (void *, uint16_t qsidx, bool clear); |
| 180 | |
| 181 | 	int (*ift_rxd_available) (void *, uint16_t qsidx, qidx_t pidx, qidx_t budget); |
| 182 | 	int (*ift_rxd_pkt_get) (void *, if_rxd_info_t ri); |
| 183 | 	void (*ift_rxd_refill) (void * , if_rxd_update_t iru); |
| 184 | 	void (*ift_rxd_flush) (void *, uint16_t qsidx, uint8_t flidx, qidx_t pidx); |
| 185 | 	int (*ift_legacy_intr) (void *); |
| 186 | 	qidx_t (*ift_txq_select) (void *, struct mbuf *); |
| 187 | 	qidx_t (*ift_txq_select_v2) (void *, struct mbuf *, if_pkt_info_t); |
| 188 | } *if_txrx_t; |
| 189 | |
| 190 | typedef struct if_softc_ctx { |
| 191 | 	int isc_vectors; |
| 192 | 	int isc_nrxqsets; |
| 193 | 	int isc_ntxqsets; |
| 194 | 	uint16_t __spare0__; |
| 195 | 	uint32_t __spare1__; |
| 196 | 	int isc_msix_bar;		/* can be model specific - initialize in attach_pre */ |
| 197 | 	int isc_tx_nsegments;		/* can be model specific - initialize in attach_pre */ |
| 198 | 	int isc_ntxd[8]; |
| 199 | 	int isc_nrxd[8]; |
| 200 | |
| 201 | 	uint32_t isc_txqsizes[8]; |
| 202 | 	uint32_t isc_rxqsizes[8]; |
| 203 | 	/* is there such thing as a descriptor that is more than 248 bytes ? */ |
| 204 | 	uint8_t isc_txd_size[8]; |
| 205 | 	uint8_t isc_rxd_size[8]; |
| 206 | |
| 207 | 	int isc_tx_tso_segments_max; |
| 208 | 	int isc_tx_tso_size_max; |
| 209 | 	int isc_tx_tso_segsize_max; |
| 210 | 	int isc_tx_csum_flags; |
| 211 | 	int isc_capabilities; |
| 212 | 	int isc_capenable; |
| 213 | 	int isc_rss_table_size; |
| 214 | 	int isc_rss_table_mask; |
| 215 | 	int isc_nrxqsets_max; |
| 216 | 	int isc_ntxqsets_max; |
| 217 | 	uint32_t __spare2__; |
| 218 | |
| 219 | 	iflib_intr_mode_t isc_intr; |
| 220 | 	uint16_t isc_rxd_buf_size[8]; /* set at init time by driver, 0 |
| 221 | 				 means use iflib-calculated size |
| 222 | 				 based on isc_max_frame_size */ |
| 223 | 	uint16_t isc_max_frame_size; /* set at init time by driver */ |
| 224 | 	uint16_t isc_min_frame_size; /* set at init time by driver, only used if |
| 225 | 					IFLIB_NEED_ETHER_PAD is set. */ |
| 226 | 	uint32_t isc_pause_frames; /* set by driver for iflib_timer to detect */ |
| 227 | 	uint32_t __spare3__; |
| 228 | 	uint32_t __spare4__; |
| 229 | 	uint32_t __spare5__; |
| 230 | 	uint32_t __spare6__; |
| 231 | 	uint32_t __spare7__; |
| 232 | 	uint32_t __spare8__; |
| 233 | 	caddr_t __spare9__; |
| 234 | 	int isc_disable_msix; |
| 235 | 	if_txrx_t isc_txrx; |
| 236 | 	struct ifmedia *isc_media; |
| 237 | 	bus_size_t isc_dma_width;	/* device dma width in bits, 0 means |
| 238 | 					 use BUS_SPACE_MAXADDR instead */ |
| 239 | } *if_softc_ctx_t; |
| 240 | |
| 241 | /* |
| 242 | * Initialization values for device |
| 243 | */ |
| 244 | struct if_shared_ctx { |
| 245 | 	unsigned isc_magic; |
| 246 | 	driver_t *isc_driver; |
| 247 | 	bus_size_t isc_q_align; |
| 248 | 	bus_size_t isc_tx_maxsize; |
| 249 | 	bus_size_t isc_tx_maxsegsize; |
| 250 | 	bus_size_t isc_tso_maxsize; |
| 251 | 	bus_size_t isc_tso_maxsegsize; |
| 252 | 	bus_size_t isc_rx_maxsize; |
| 253 | 	bus_size_t isc_rx_maxsegsize; |
| 254 | 	int isc_rx_nsegments; |
| 255 | 	int isc_admin_intrcnt;		/* # of admin/link interrupts */ |
| 256 | |
| 257 | 	/* fields necessary for probe */ |
| 258 | 	const pci_vendor_info_t *isc_vendor_info; |
| 259 | 	const char *isc_driver_version; |
| 260 | 	/* optional function to transform the read values to match the table*/ |
| 261 | 	void (*isc_parse_devinfo) (uint16_t *device_id, uint16_t *subvendor_id, |
| 262 | 				 uint16_t *subdevice_id, uint16_t *rev_id); |
| 263 | 	int isc_nrxd_min[8]; |
| 264 | 	int isc_nrxd_default[8]; |
| 265 | 	int isc_nrxd_max[8]; |
| 266 | 	int isc_ntxd_min[8]; |
| 267 | 	int isc_ntxd_default[8]; |
| 268 | 	int isc_ntxd_max[8]; |
| 269 | |
| 270 | 	/* actively used during operation */ |
| 271 | 	int isc_nfl __aligned(CACHE_LINE_SIZE); |
| 272 | 	int isc_ntxqs;			/* # of tx queues per tx qset - usually 1 */ |
| 273 | 	int isc_nrxqs;			/* # of rx queues per rx qset - intel 1, chelsio 2, broadcom 3 */ |
| 274 | 	int __spare0__; |
| 275 | 	int isc_tx_reclaim_thresh; |
| 276 | 	int isc_flags; |
| 277 | }; |
| 278 | |
| 279 | typedef struct iflib_dma_info { |
| 280 | 	bus_addr_t		idi_paddr; |
| 281 | 	caddr_t			idi_vaddr; |
| 282 | 	bus_dma_tag_t		idi_tag; |
| 283 | 	bus_dmamap_t		idi_map; |
| 284 | 	uint32_t		idi_size; |
| 285 | } *iflib_dma_info_t; |
| 286 | |
| 287 | #define IFLIB_MAGIC 0xCAFEF00D |
| 288 | |
| 289 | typedef enum { |
| 290 | 	/* Interrupt or softirq handles only receive */ |
| 291 | 	IFLIB_INTR_RX, |
| 292 | |
| 293 | 	/* Interrupt or softirq handles only transmit */ |
| 294 | 	IFLIB_INTR_TX, |
| 295 | |
| 296 | 	/* |
| 297 | 	 * Interrupt will check for both pending receive |
| 298 | 	 * and available tx credits and dispatch a task |
| 299 | 	 * for one or both depending on the disposition |
| 300 | 	 * of the respective queues. |
| 301 | 	 */ |
| 302 | 	IFLIB_INTR_RXTX, |
| 303 | |
| 304 | 	/* |
| 305 | 	 * Other interrupt - typically link status and |
| 306 | 	 * or error conditions. |
| 307 | 	 */ |
| 308 | 	IFLIB_INTR_ADMIN, |
| 309 | |
| 310 | 	/* Softirq (task) for iov handling */ |
| 311 | 	IFLIB_INTR_IOV, |
| 312 | } iflib_intr_type_t; |
| 313 | |
| 314 | /* |
| 315 | * Interface has a separate completion queue for RX |
| 316 | */ |
| 317 | #define IFLIB_HAS_RXCQ		0x01 |
| 318 | /* |
| 319 | * Driver has already allocated vectors |
| 320 | */ |
| 321 | #define IFLIB_SKIP_MSIX		0x02 |
| 322 | /* |
| 323 | * Interface is a virtual function |
| 324 | */ |
| 325 | #define IFLIB_IS_VF		0x04 |
| 326 | /* |
| 327 | * Interface has a separate completion queue for TX |
| 328 | */ |
| 329 | #define IFLIB_HAS_TXCQ		0x08 |
| 330 | /* |
| 331 | * Interface does checksum in place |
| 332 | */ |
| 333 | #define IFLIB_NEED_SCRATCH	0x10 |
| 334 | /* |
| 335 | * Interface doesn't expect in_pseudo for th_sum |
| 336 | */ |
| 337 | #define IFLIB_TSO_INIT_IP	0x20 |
| 338 | /* |
| 339 | * Interface doesn't align IP header |
| 340 | */ |
| 341 | #define IFLIB_DO_RX_FIXUP	0x40 |
| 342 | /* |
| 343 | * Driver needs csum zeroed for offloading |
| 344 | */ |
| 345 | #define IFLIB_NEED_ZERO_CSUM	0x80 |
| 346 | /* |
| 347 | * Driver needs frames padded to some minimum length |
| 348 | */ |
| 349 | #define IFLIB_NEED_ETHER_PAD	0x100 |
| 350 | #define	IFLIB_SPARE7		0x200 |
| 351 | #define	IFLIB_SPARE6		0x400 |
| 352 | #define	IFLIB_SPARE5		0x800 |
| 353 | #define	IFLIB_SPARE4		0x1000 |
| 354 | #define	IFLIB_SPARE3		0x2000 |
| 355 | #define	IFLIB_SPARE2		0x4000 |
| 356 | #define	IFLIB_SPARE1		0x8000 |
| 357 | /* |
| 358 | * Interface needs admin task to ignore interface up/down status |
| 359 | */ |
| 360 | #define IFLIB_ADMIN_ALWAYS_RUN	0x10000 |
| 361 | /* |
| 362 | * Driver will pass the media |
| 363 | */ |
| 364 | #define IFLIB_DRIVER_MEDIA	0x20000 |
| 365 | /* |
| 366 | * When using a single hardware interrupt for the interface, only process RX |
| 367 | * interrupts instead of doing combined RX/TX processing. |
| 368 | */ |
| 369 | #define	IFLIB_SINGLE_IRQ_RX_ONLY	0x40000 |
| 370 | #define	IFLIB_SPARE0		0x80000 |
| 371 | /* |
| 372 | * Interface has an admin completion queue |
| 373 | */ |
| 374 | #define IFLIB_HAS_ADMINCQ	0x100000 |
| 375 | /* |
| 376 | * Interface needs to preserve TX ring indices across restarts. |
| 377 | */ |
| 378 | #define IFLIB_PRESERVE_TX_INDICES	0x200000 |
| 379 | |
| 380 | /* The following IFLIB_FEATURE_* defines are for driver modules to determine |
| 381 | * what features this version of iflib supports. They shall be defined to the |
| 382 | * first __FreeBSD_version that introduced the feature. |
| 383 | */ |
| 384 | /* |
| 385 | * Driver can set its own TX queue selection function |
| 386 | * as ift_txq_select in struct if_txrx |
| 387 | */ |
| 388 | #define IFLIB_FEATURE_QUEUE_SELECT	1400050 |
| 389 | /* |
| 390 | * Driver can set its own TX queue selection function |
| 391 | * as ift_txq_select_v2 in struct if_txrx. This includes |
| 392 | * having iflib send L3+ extra header information to the |
| 393 | * function. |
| 394 | */ |
| 395 | #define IFLIB_FEATURE_QUEUE_SELECT_V2	1400073 |
| 396 | /* |
| 397 | * Driver can create subinterfaces with their own Tx/Rx queues |
| 398 | * that all share a single device (or commonly, port) |
| 399 | */ |
| 400 | #define IFLIB_FEATURE_SUB_INTERFACES	1500014 |
| 401 | |
| 402 | /* |
| 403 | * These enum values are used in iflib_needs_restart to indicate to iflib |
| 404 | * functions whether or not the interface needs restarting when certain events |
| 405 | * happen. |
| 406 | */ |
| 407 | enum iflib_restart_event { |
| 408 | 	IFLIB_RESTART_VLAN_CONFIG, |
| 409 | }; |
| 410 | |
| 411 | /* |
| 412 | * field accessors |
| 413 | */ |
| 414 | void *iflib_get_softc(if_ctx_t ctx); |
| 415 | |
| 416 | device_t iflib_get_dev(if_ctx_t ctx); |
| 417 | |
| 418 | if_t iflib_get_ifp(if_ctx_t ctx); |
| 419 | |
| 420 | struct ifmedia *iflib_get_media(if_ctx_t ctx); |
| 421 | |
| 422 | if_softc_ctx_t iflib_get_softc_ctx(if_ctx_t ctx); |
| 423 | if_shared_ctx_t iflib_get_sctx(if_ctx_t ctx); |
| 424 | |
| 425 | void iflib_set_mac(if_ctx_t ctx, uint8_t mac[ETHER_ADDR_LEN]); |
| 426 | void iflib_request_reset(if_ctx_t ctx); |
| 427 | uint8_t iflib_in_detach(if_ctx_t ctx); |
| 428 | |
| 429 | uint32_t iflib_get_rx_mbuf_sz(if_ctx_t ctx); |
| 430 | |
| 431 | /* |
| 432 | * If the driver can plug cleanly in to newbus use these |
| 433 | */ |
| 434 | int iflib_device_probe(device_t); |
| 435 | int iflib_device_attach(device_t); |
| 436 | int iflib_device_detach(device_t); |
| 437 | int iflib_device_suspend(device_t); |
| 438 | int iflib_device_resume(device_t); |
| 439 | int iflib_device_shutdown(device_t); |
| 440 | |
| 441 | /* |
| 442 | * Use this instead of iflib_device_probe if the driver should report |
| 443 | * BUS_PROBE_VENDOR instead of BUS_PROBE_DEFAULT. (For example, an out-of-tree |
| 444 | * driver based on iflib). |
| 445 | */ |
| 446 | int iflib_device_probe_vendor(device_t); |
| 447 | |
| 448 | int iflib_device_iov_init(device_t, uint16_t, const nvlist_t *); |
| 449 | void iflib_device_iov_uninit(device_t); |
| 450 | int iflib_device_iov_add_vf(device_t, uint16_t, const nvlist_t *); |
| 451 | |
| 452 | /* |
| 453 | * If the driver can't plug cleanly in to newbus |
| 454 | * use these |
| 455 | */ |
| 456 | int iflib_device_register(device_t dev, void *softc, if_shared_ctx_t sctx, if_ctx_t *ctxp); |
| 457 | int iflib_device_deregister(if_ctx_t); |
| 458 | |
| 459 | int iflib_irq_alloc(if_ctx_t, if_irq_t, int, driver_filter_t, void *filter_arg, |
| 460 | 		 driver_intr_t, void *arg, const char *name); |
| 461 | int iflib_irq_alloc_generic(if_ctx_t ctx, if_irq_t irq, int rid, |
| 462 | 			 iflib_intr_type_t type, driver_filter_t *filter, |
| 463 | 			 void *filter_arg, int qid, const char *name); |
| 464 | void iflib_softirq_alloc_generic(if_ctx_t ctx, if_irq_t irq, |
| 465 | 				 iflib_intr_type_t type, void *arg, int qid, |
| 466 | 				 const char *name); |
| 467 | |
| 468 | void iflib_irq_free(if_ctx_t ctx, if_irq_t irq); |
| 469 | |
| 470 | void iflib_io_tqg_attach(struct grouptask *gt, void *uniq, int cpu, |
| 471 | const char *name); |
| 472 | |
| 473 | void iflib_config_task_init(if_ctx_t ctx, struct task *config_task, |
| 474 | task_fn_t *fn); |
| 475 | void iflib_config_task_enqueue(if_ctx_t ctx, struct task *config_task); |
| 476 | |
| 477 | void iflib_tx_intr_deferred(if_ctx_t ctx, int txqid); |
| 478 | void iflib_rx_intr_deferred(if_ctx_t ctx, int rxqid); |
| 479 | void iflib_admin_intr_deferred(if_ctx_t ctx); |
| 480 | void iflib_iov_intr_deferred(if_ctx_t ctx); |
| 481 | |
| 482 | void iflib_link_state_change(if_ctx_t ctx, int linkstate, uint64_t baudrate); |
| 483 | |
| 484 | int iflib_dma_alloc(if_ctx_t ctx, int size, iflib_dma_info_t dma, int mapflags); |
| 485 | int iflib_dma_alloc_align(if_ctx_t ctx, int size, int align, iflib_dma_info_t dma, int mapflags); |
| 486 | void iflib_dma_free(iflib_dma_info_t dma); |
| 487 | int iflib_dma_alloc_multi(if_ctx_t ctx, int *sizes, iflib_dma_info_t *dmalist, int mapflags, int count); |
| 488 | |
| 489 | void iflib_dma_free_multi(iflib_dma_info_t *dmalist, int count); |
| 490 | |
| 491 | struct sx *iflib_ctx_lock_get(if_ctx_t); |
| 492 | |
| 493 | void iflib_led_create(if_ctx_t ctx); |
| 494 | |
| 495 | void iflib_add_int_delay_sysctl(if_ctx_t, const char *, const char *, |
| 496 | 								if_int_delay_info_t, int, int); |
| 497 | uint16_t iflib_get_extra_msix_vectors_sysctl(if_ctx_t ctx); |
| 498 | |
| 499 | /* |
| 500 | * Sub-interface support |
| 501 | */ |
| 502 | int iflib_irq_alloc_generic_subctx(if_ctx_t ctx, if_ctx_t subctx, if_irq_t irq, |
| 503 | 				 int rid, iflib_intr_type_t type, |
| 504 | 				 driver_filter_t *filter, void *filter_arg, |
| 505 | 				 int qid, const char *name); |
| 506 | #endif /* __IFLIB_H_ */ |