xref: /freebsd/sys/dev/enic/enic.h (revision 0acab8b3d1336d4db73a9946ef76b4bcd0b0aabe)
19c067b84SDoug Ambrisko /* SPDX-License-Identifier: BSD-3-Clause
29c067b84SDoug Ambrisko  * Copyright 2008-2017 Cisco Systems, Inc.  All rights reserved.
39c067b84SDoug Ambrisko  * Copyright 2007 Nuova Systems, Inc.  All rights reserved.
49c067b84SDoug Ambrisko  */
59c067b84SDoug Ambrisko 
69c067b84SDoug Ambrisko #ifndef _ENIC_H
79c067b84SDoug Ambrisko #define _ENIC_H
89c067b84SDoug Ambrisko 
99c067b84SDoug Ambrisko #include <sys/param.h>
109c067b84SDoug Ambrisko #include <sys/socket.h>
119c067b84SDoug Ambrisko #include <sys/sysctl.h>
129c067b84SDoug Ambrisko #include <sys/taskqueue.h>
139c067b84SDoug Ambrisko 
149c067b84SDoug Ambrisko #include <machine/bus.h>
159c067b84SDoug Ambrisko 
169c067b84SDoug Ambrisko #include <net/ethernet.h>
179c067b84SDoug Ambrisko #include <net/if.h>
189c067b84SDoug Ambrisko #include <net/if_var.h>
199c067b84SDoug Ambrisko #include <net/iflib.h>
209c067b84SDoug Ambrisko 
219c067b84SDoug Ambrisko #define u8  uint8_t
229c067b84SDoug Ambrisko #define u16 uint16_t
239c067b84SDoug Ambrisko #define u32 uint32_t
249c067b84SDoug Ambrisko #define u64 uint64_t
259c067b84SDoug Ambrisko 
269c067b84SDoug Ambrisko struct enic_bar_info {
279c067b84SDoug Ambrisko 	struct resource		*res;
289c067b84SDoug Ambrisko 	bus_space_tag_t		tag;
299c067b84SDoug Ambrisko 	bus_space_handle_t	handle;
309c067b84SDoug Ambrisko 	bus_size_t		size;
319c067b84SDoug Ambrisko 	int			rid;
329c067b84SDoug Ambrisko 	int			offset;
339c067b84SDoug Ambrisko };
349c067b84SDoug Ambrisko 
359c067b84SDoug Ambrisko #define ENIC_BUS_WRITE_8(res, index, value) \
369c067b84SDoug Ambrisko     bus_space_write_8(res->bar.tag, res->bar.handle, \
379c067b84SDoug Ambrisko     res->bar.offset + (index), value)
389c067b84SDoug Ambrisko #define ENIC_BUS_WRITE_4(res, index, value) \
399c067b84SDoug Ambrisko     bus_space_write_4(res->bar.tag, res->bar.handle, \
409c067b84SDoug Ambrisko     res->bar.offset + (index), value)
419c067b84SDoug Ambrisko #define ENIC_BUS_WRITE_REGION_4(res, index, values, count) \
429c067b84SDoug Ambrisko     bus_space_write_region_4(res->bar.tag, res->bar.handle, \
439c067b84SDoug Ambrisko     res->bar.offset + (index), values, count);
449c067b84SDoug Ambrisko 
459c067b84SDoug Ambrisko #define ENIC_BUS_READ_8(res, index) \
469c067b84SDoug Ambrisko     bus_space_read_8(res->bar.tag, res->bar.handle, \
479c067b84SDoug Ambrisko     res->bar.offset + (index))
489c067b84SDoug Ambrisko #define ENIC_BUS_READ_4(res, index) \
499c067b84SDoug Ambrisko     bus_space_read_4(res->bar.tag, res->bar.handle, \
509c067b84SDoug Ambrisko     res->bar.offset + (index))
519c067b84SDoug Ambrisko #define ENIC_BUS_READ_REGION_4(res, type, index, values, count) \
529c067b84SDoug Ambrisko     bus_space_read_region_4(res->type.tag, res->type.handle, \
539c067b84SDoug Ambrisko     res->type.offset + (index), values, count);
549c067b84SDoug Ambrisko 
559c067b84SDoug Ambrisko struct vnic_res {
569c067b84SDoug Ambrisko 	unsigned int count;
579c067b84SDoug Ambrisko 	struct enic_bar_info bar;
589c067b84SDoug Ambrisko };
599c067b84SDoug Ambrisko 
609c067b84SDoug Ambrisko #include "vnic_enet.h"
619c067b84SDoug Ambrisko #include "vnic_dev.h"
629c067b84SDoug Ambrisko #include "vnic_wq.h"
639c067b84SDoug Ambrisko #include "vnic_rq.h"
649c067b84SDoug Ambrisko #include "vnic_cq.h"
659c067b84SDoug Ambrisko #include "vnic_intr.h"
669c067b84SDoug Ambrisko #include "vnic_stats.h"
679c067b84SDoug Ambrisko #include "vnic_nic.h"
689c067b84SDoug Ambrisko #include "vnic_rss.h"
699c067b84SDoug Ambrisko #include "enic_res.h"
709c067b84SDoug Ambrisko #include "cq_enet_desc.h"
719c067b84SDoug Ambrisko 
729c067b84SDoug Ambrisko #define ENIC_LOCK(_softc)	mtx_lock(&(_softc)->enic_lock)
739c067b84SDoug Ambrisko #define ENIC_UNLOCK(_softc)	mtx_unlock(&(_softc)->enic_lock)
749c067b84SDoug Ambrisko 
759c067b84SDoug Ambrisko #define DRV_NAME		"enic"
769c067b84SDoug Ambrisko #define DRV_DESCRIPTION		"Cisco VIC Ethernet NIC"
779c067b84SDoug Ambrisko #define DRV_COPYRIGHT		"Copyright 2008-2015 Cisco Systems, Inc"
789c067b84SDoug Ambrisko 
799c067b84SDoug Ambrisko #define ENIC_MAX_MAC_ADDR	64
809c067b84SDoug Ambrisko 
819c067b84SDoug Ambrisko #define VLAN_ETH_HLEN           18
829c067b84SDoug Ambrisko 
839c067b84SDoug Ambrisko #define ENICPMD_SETTING(enic, f) ((enic->config.flags & VENETF_##f) ? 1 : 0)
849c067b84SDoug Ambrisko 
859c067b84SDoug Ambrisko #define ENICPMD_BDF_LENGTH		13   /* 0000:00:00.0'\0' */
869c067b84SDoug Ambrisko #define ENIC_CALC_IP_CKSUM		1
879c067b84SDoug Ambrisko #define ENIC_CALC_TCP_UDP_CKSUM		2
889c067b84SDoug Ambrisko #define ENIC_MAX_MTU			9000
899c067b84SDoug Ambrisko #define ENIC_PAGE_SIZE			4096
909c067b84SDoug Ambrisko #define PAGE_ROUND_UP(x) \
919c067b84SDoug Ambrisko 	((((unsigned long)(x)) + ENIC_PAGE_SIZE-1) & (~(ENIC_PAGE_SIZE-1)))
929c067b84SDoug Ambrisko 
939c067b84SDoug Ambrisko /* must be >= VNIC_COUNTER_DMA_MIN_PERIOD */
949c067b84SDoug Ambrisko #define VNIC_FLOW_COUNTER_UPDATE_MSECS 500
959c067b84SDoug Ambrisko 
969c067b84SDoug Ambrisko /* PCI IDs */
979c067b84SDoug Ambrisko #define CISCO_VENDOR_ID	0x1137
989c067b84SDoug Ambrisko 
999c067b84SDoug Ambrisko #define PCI_DEVICE_ID_CISCO_VIC_ENET	0x0043  /* ethernet vnic */
1009c067b84SDoug Ambrisko #define PCI_DEVICE_ID_CISCO_VIC_ENET_VF	0x0071  /* enet SRIOV VF */
1019c067b84SDoug Ambrisko 
1029c067b84SDoug Ambrisko /* Special Filter id for non-specific packet flagging. Don't change value */
1039c067b84SDoug Ambrisko #define ENIC_MAGIC_FILTER_ID 0xffff
1049c067b84SDoug Ambrisko 
1059c067b84SDoug Ambrisko #define ENICPMD_FDIR_MAX		64
1069c067b84SDoug Ambrisko 
1079c067b84SDoug Ambrisko /* HW default VXLAN port */
1089c067b84SDoug Ambrisko #define ENIC_DEFAULT_VXLAN_PORT		4789
1099c067b84SDoug Ambrisko 
1109c067b84SDoug Ambrisko /*
1119c067b84SDoug Ambrisko  * Interrupt 1: rx queue 0
1129c067b84SDoug Ambrisko  * Interrupt 2: rx queue 1
1139c067b84SDoug Ambrisko  * ...
114*0acab8b3SDoug Ambrisko  * Interrupt x: LSC and errors
1159c067b84SDoug Ambrisko  */
1169c067b84SDoug Ambrisko #define ENICPMD_LSC_INTR_OFFSET 0
117*0acab8b3SDoug Ambrisko #define ENICPMD_RXQ_INTR_OFFSET 0
1189c067b84SDoug Ambrisko 
1199c067b84SDoug Ambrisko #include "vnic_devcmd.h"
1209c067b84SDoug Ambrisko 
1219c067b84SDoug Ambrisko enum vnic_proxy_type {
1229c067b84SDoug Ambrisko 	PROXY_NONE,
1239c067b84SDoug Ambrisko 	PROXY_BY_BDF,
1249c067b84SDoug Ambrisko 	PROXY_BY_INDEX,
1259c067b84SDoug Ambrisko };
1269c067b84SDoug Ambrisko 
1279c067b84SDoug Ambrisko struct vnic_intr_coal_timer_info {
1289c067b84SDoug Ambrisko 	u32 mul;
1299c067b84SDoug Ambrisko 	u32 div;
1309c067b84SDoug Ambrisko 	u32 max_usec;
1319c067b84SDoug Ambrisko };
1329c067b84SDoug Ambrisko 
1339c067b84SDoug Ambrisko struct enic_softc;
1349c067b84SDoug Ambrisko struct vnic_dev {
1359c067b84SDoug Ambrisko 	void *priv;
1369c067b84SDoug Ambrisko 	struct rte_pci_device *pdev;
1379c067b84SDoug Ambrisko 	struct vnic_res res[RES_TYPE_MAX];
1389c067b84SDoug Ambrisko 	enum vnic_dev_intr_mode intr_mode;
1399c067b84SDoug Ambrisko 	struct vnic_res __iomem *devcmd;
1409c067b84SDoug Ambrisko 	struct vnic_devcmd_notify *notify;
1419c067b84SDoug Ambrisko 	struct vnic_devcmd_notify notify_copy;
1429c067b84SDoug Ambrisko 	bus_addr_t notify_pa;
1439c067b84SDoug Ambrisko 	struct iflib_dma_info notify_res;
1449c067b84SDoug Ambrisko 	u32 notify_sz;
1459c067b84SDoug Ambrisko 	struct iflib_dma_info linkstatus_res;
1469c067b84SDoug Ambrisko 	struct vnic_stats *stats;
1479c067b84SDoug Ambrisko 	struct iflib_dma_info stats_res;
1489c067b84SDoug Ambrisko 	struct vnic_devcmd_fw_info *fw_info;
1499c067b84SDoug Ambrisko 	struct iflib_dma_info fw_info_res;
1509c067b84SDoug Ambrisko 	enum vnic_proxy_type proxy;
1519c067b84SDoug Ambrisko 	u32 proxy_index;
1529c067b84SDoug Ambrisko 	u64 args[VNIC_DEVCMD_NARGS];
1539c067b84SDoug Ambrisko 	int in_reset;
1549c067b84SDoug Ambrisko 	struct vnic_intr_coal_timer_info intr_coal_timer_info;
155*0acab8b3SDoug Ambrisko 	struct devcmd2_controller *devcmd2;
156*0acab8b3SDoug Ambrisko 	int (*devcmd_rtn)(struct vnic_dev *vdev, enum vnic_devcmd_cmd cmd,
157*0acab8b3SDoug Ambrisko 	    int wait);
1589c067b84SDoug Ambrisko 	void *(*alloc_consistent)(void *priv, size_t size,
1599c067b84SDoug Ambrisko 	    bus_addr_t *dma_handle, struct iflib_dma_info *res, u8 *name);
1609c067b84SDoug Ambrisko 	void (*free_consistent)(void *priv, size_t size, void *vaddr,
1619c067b84SDoug Ambrisko 	    bus_addr_t dma_handle, struct iflib_dma_info *res);
1629c067b84SDoug Ambrisko 	struct vnic_counter_counts *flow_counters;
1639c067b84SDoug Ambrisko 	struct iflib_dma_info flow_counters_res;
1649c067b84SDoug Ambrisko 	u8 flow_counters_dma_active;
1659c067b84SDoug Ambrisko 	struct enic_softc *softc;
1669c067b84SDoug Ambrisko };
1679c067b84SDoug Ambrisko 
1689c067b84SDoug Ambrisko struct enic_soft_stats {
1699c067b84SDoug Ambrisko 	uint64_t rx_nombuf;
1709c067b84SDoug Ambrisko 	uint64_t rx_packet_errors;
1719c067b84SDoug Ambrisko 	uint64_t tx_oversized;
1729c067b84SDoug Ambrisko };
1739c067b84SDoug Ambrisko 
1749c067b84SDoug Ambrisko struct intr_queue {
1759c067b84SDoug Ambrisko 	struct if_irq intr_irq;
1769c067b84SDoug Ambrisko 	struct resource *res;
1779c067b84SDoug Ambrisko 	int rid;
1789c067b84SDoug Ambrisko 	struct enic_softc *softc;
1799c067b84SDoug Ambrisko };
1809c067b84SDoug Ambrisko 
181*0acab8b3SDoug Ambrisko #define ENIC_MAX_LINK_SPEEDS		3
182*0acab8b3SDoug Ambrisko #define ENIC_LINK_SPEED_10G		10000
183*0acab8b3SDoug Ambrisko #define ENIC_LINK_SPEED_4G		4000
184*0acab8b3SDoug Ambrisko #define ENIC_LINK_40G_INDEX		2
185*0acab8b3SDoug Ambrisko #define ENIC_LINK_10G_INDEX		1
186*0acab8b3SDoug Ambrisko #define ENIC_LINK_4G_INDEX		0
187*0acab8b3SDoug Ambrisko #define ENIC_RX_COALESCE_RANGE_END	125
188*0acab8b3SDoug Ambrisko #define ENIC_AIC_TS_BREAK		100
189*0acab8b3SDoug Ambrisko 
190*0acab8b3SDoug Ambrisko struct enic_rx_coal {
191*0acab8b3SDoug Ambrisko 	u32 small_pkt_range_start;
192*0acab8b3SDoug Ambrisko 	u32 large_pkt_range_start;
193*0acab8b3SDoug Ambrisko 	u32 range_end;
194*0acab8b3SDoug Ambrisko 	u32 use_adaptive_rx_coalesce;
195*0acab8b3SDoug Ambrisko };
196*0acab8b3SDoug Ambrisko 
197*0acab8b3SDoug Ambrisko /* Store only the lower range.  Higher range is given by fw. */
198*0acab8b3SDoug Ambrisko struct enic_intr_mod_range {
199*0acab8b3SDoug Ambrisko 	u32 small_pkt_range_start;
200*0acab8b3SDoug Ambrisko 	u32 large_pkt_range_start;
201*0acab8b3SDoug Ambrisko };
202*0acab8b3SDoug Ambrisko 
2039c067b84SDoug Ambrisko struct enic {
2049c067b84SDoug Ambrisko 	struct enic *next;
2059c067b84SDoug Ambrisko 	struct rte_pci_device *pdev;
2069c067b84SDoug Ambrisko 	struct vnic_enet_config config;
2079c067b84SDoug Ambrisko 	struct vnic_dev_bar bar0;
2089c067b84SDoug Ambrisko 	struct vnic_dev *vdev;
2099c067b84SDoug Ambrisko 
2109c067b84SDoug Ambrisko 	/*
2119c067b84SDoug Ambrisko 	 * mbuf_initializer contains 64 bits of mbuf rearm_data, used by
2129c067b84SDoug Ambrisko 	 * the avx2 handler at this time.
2139c067b84SDoug Ambrisko 	 */
2149c067b84SDoug Ambrisko 	uint64_t mbuf_initializer;
2159c067b84SDoug Ambrisko 	unsigned int port_id;
2169c067b84SDoug Ambrisko 	bool overlay_offload;
2179c067b84SDoug Ambrisko 	char bdf_name[ENICPMD_BDF_LENGTH];
2189c067b84SDoug Ambrisko 	int dev_fd;
2199c067b84SDoug Ambrisko 	int iommu_group_fd;
2209c067b84SDoug Ambrisko 	int iommu_groupid;
2219c067b84SDoug Ambrisko 	int eventfd;
2229c067b84SDoug Ambrisko 	uint8_t mac_addr[ETH_ALEN];
2239c067b84SDoug Ambrisko 	pthread_t err_intr_thread;
2249c067b84SDoug Ambrisko 	u8 ig_vlan_strip_en;
2259c067b84SDoug Ambrisko 	int link_status;
2269c067b84SDoug Ambrisko 	u8 hw_ip_checksum;
2279c067b84SDoug Ambrisko 	u16 max_mtu;
2289c067b84SDoug Ambrisko 	u8 adv_filters;
2299c067b84SDoug Ambrisko 	u32 flow_filter_mode;
2309c067b84SDoug Ambrisko 	u8 filter_actions; /* HW supported actions */
2319c067b84SDoug Ambrisko 	bool vxlan;
2329c067b84SDoug Ambrisko 	bool disable_overlay; /* devargs disable_overlay=1 */
2339c067b84SDoug Ambrisko 	uint8_t enable_avx2_rx;  /* devargs enable-avx2-rx=1 */
2349c067b84SDoug Ambrisko 	bool nic_cfg_chk;     /* NIC_CFG_CHK available */
2359c067b84SDoug Ambrisko 	bool udp_rss_weak;    /* Bodega style UDP RSS */
2369c067b84SDoug Ambrisko 	uint8_t ig_vlan_rewrite_mode; /* devargs ig-vlan-rewrite */
2379c067b84SDoug Ambrisko 	uint16_t vxlan_port;  /* current vxlan port pushed to NIC */
2389c067b84SDoug Ambrisko 
2399c067b84SDoug Ambrisko 	unsigned int flags;
2409c067b84SDoug Ambrisko 	unsigned int priv_flags;
2419c067b84SDoug Ambrisko 
2429c067b84SDoug Ambrisko 	/* work queue (len = conf_wq_count) */
2439c067b84SDoug Ambrisko 	struct vnic_wq *wq;
2449c067b84SDoug Ambrisko 	unsigned int wq_count; /* equals eth_dev nb_tx_queues */
2459c067b84SDoug Ambrisko 
2469c067b84SDoug Ambrisko 	/* receive queue (len = conf_rq_count) */
2479c067b84SDoug Ambrisko 	struct vnic_rq *rq;
2489c067b84SDoug Ambrisko 	unsigned int rq_count; /* equals eth_dev nb_rx_queues */
2499c067b84SDoug Ambrisko 
2509c067b84SDoug Ambrisko 	/* completion queue (len = conf_cq_count) */
2519c067b84SDoug Ambrisko 	struct vnic_cq *cq;
2529c067b84SDoug Ambrisko 	unsigned int cq_count; /* equals rq_count + wq_count */
2539c067b84SDoug Ambrisko 
2549c067b84SDoug Ambrisko 	/* interrupt vectors (len = conf_intr_count) */
2559c067b84SDoug Ambrisko 	struct vnic_intr *intr;
25675ff9081SZhenlei Huang 	struct intr_queue *intr_queues;
2579c067b84SDoug Ambrisko 	unsigned int intr_count; /* equals enabled interrupts (lsc + rxqs) */
2589c067b84SDoug Ambrisko 
2599c067b84SDoug Ambrisko 
2609c067b84SDoug Ambrisko 	/* software counters */
2619c067b84SDoug Ambrisko 	struct enic_soft_stats soft_stats;
2629c067b84SDoug Ambrisko 
2639c067b84SDoug Ambrisko 	/* configured resources on vic */
2649c067b84SDoug Ambrisko 	unsigned int conf_rq_count;
2659c067b84SDoug Ambrisko 	unsigned int conf_wq_count;
2669c067b84SDoug Ambrisko 	unsigned int conf_cq_count;
2679c067b84SDoug Ambrisko 	unsigned int conf_intr_count;
2689c067b84SDoug Ambrisko 
2699c067b84SDoug Ambrisko 	/* linked list storing memory allocations */
2709c067b84SDoug Ambrisko 	LIST_HEAD(enic_memzone_list, enic_memzone_entry) memzone_list;
2719c067b84SDoug Ambrisko 
2729c067b84SDoug Ambrisko 	LIST_HEAD(enic_flows, rte_flow) flows;
2739c067b84SDoug Ambrisko 	int max_flow_counter;
2749c067b84SDoug Ambrisko 
2759c067b84SDoug Ambrisko 	/* RSS */
2769c067b84SDoug Ambrisko 	uint16_t reta_size;
2779c067b84SDoug Ambrisko 	uint8_t hash_key_size;
2789c067b84SDoug Ambrisko 	uint64_t flow_type_rss_offloads; /* 0 indicates RSS not supported */
2799c067b84SDoug Ambrisko 	/*
2809c067b84SDoug Ambrisko 	 * Keep a copy of current RSS config for queries, as we cannot retrieve
2819c067b84SDoug Ambrisko 	 * it from the NIC.
2829c067b84SDoug Ambrisko 	 */
2839c067b84SDoug Ambrisko 	uint8_t rss_hash_type; /* NIC_CFG_RSS_HASH_TYPE flags */
2849c067b84SDoug Ambrisko 	uint8_t rss_enable;
2859c067b84SDoug Ambrisko 	uint64_t rss_hf; /* ETH_RSS flags */
2869c067b84SDoug Ambrisko 	union vnic_rss_key rss_key;
2879c067b84SDoug Ambrisko 	union vnic_rss_cpu rss_cpu;
2889c067b84SDoug Ambrisko 
2899c067b84SDoug Ambrisko 	uint64_t rx_offload_capa; /* DEV_RX_OFFLOAD flags */
2909c067b84SDoug Ambrisko 	uint64_t tx_offload_capa; /* DEV_TX_OFFLOAD flags */
2919c067b84SDoug Ambrisko 	uint64_t tx_queue_offload_capa; /* DEV_TX_OFFLOAD flags */
2929c067b84SDoug Ambrisko 	uint64_t tx_offload_mask; /* PKT_TX flags accepted */
2939c067b84SDoug Ambrisko 	struct enic_softc *softc;
2949c067b84SDoug Ambrisko 	int port_mtu;
295*0acab8b3SDoug Ambrisko 	struct enic_rx_coal rx_coalesce_setting;
296*0acab8b3SDoug Ambrisko 	u32 rx_coalesce_usecs;
297*0acab8b3SDoug Ambrisko 	u32 tx_coalesce_usecs;
2989c067b84SDoug Ambrisko };
2999c067b84SDoug Ambrisko 
3009c067b84SDoug Ambrisko struct enic_softc {
3019c067b84SDoug Ambrisko 	device_t		dev;
3029c067b84SDoug Ambrisko 	if_ctx_t		ctx;
3039c067b84SDoug Ambrisko 	if_softc_ctx_t		scctx;
3049c067b84SDoug Ambrisko 	if_shared_ctx_t		sctx;
3059c067b84SDoug Ambrisko 	struct ifmedia		*media;
306bbd354cbSDoug Ambrisko 	if_t			ifp;
3079c067b84SDoug Ambrisko 
3089c067b84SDoug Ambrisko 	struct mtx		enic_lock;
3099c067b84SDoug Ambrisko 
3109c067b84SDoug Ambrisko 	struct enic_bar_info	mem;
3119c067b84SDoug Ambrisko 	struct enic_bar_info	io;
3129c067b84SDoug Ambrisko 
3139c067b84SDoug Ambrisko 	struct vnic_dev		vdev;
3149c067b84SDoug Ambrisko 	struct enic		enic;
3159c067b84SDoug Ambrisko 
3169c067b84SDoug Ambrisko 	int ntxqsets;
3179c067b84SDoug Ambrisko 	int nrxqsets;
3189c067b84SDoug Ambrisko 
3199c067b84SDoug Ambrisko 	struct if_irq		enic_event_intr_irq;
3209c067b84SDoug Ambrisko 	struct if_irq		enic_err_intr_irq;
3219c067b84SDoug Ambrisko 	uint8_t			lladdr[ETHER_ADDR_LEN];
3229c067b84SDoug Ambrisko 	int			link_active;
3239c067b84SDoug Ambrisko 	int			stopped;
3249c067b84SDoug Ambrisko 	uint8_t			mac_addr[ETHER_ADDR_LEN];
3259c067b84SDoug Ambrisko 
3269c067b84SDoug Ambrisko 	int			directed;
3279c067b84SDoug Ambrisko 	int			multicast;
3289c067b84SDoug Ambrisko 	int			broadcast;
3299c067b84SDoug Ambrisko 	int			promisc;
3309c067b84SDoug Ambrisko 	int 			allmulti;
3319c067b84SDoug Ambrisko 
3329c067b84SDoug Ambrisko 	u_int			mc_count;
3339c067b84SDoug Ambrisko 	uint8_t			*mta;
3349c067b84SDoug Ambrisko };
3359c067b84SDoug Ambrisko 
3369c067b84SDoug Ambrisko /* Per-instance private data structure */
3379c067b84SDoug Ambrisko 
enic_cq_rq(struct enic * enic,unsigned int rq)3389c067b84SDoug Ambrisko static inline unsigned int enic_cq_rq(struct enic *enic, unsigned int rq)
3399c067b84SDoug Ambrisko {
3409c067b84SDoug Ambrisko 	return rq;
3419c067b84SDoug Ambrisko }
3429c067b84SDoug Ambrisko 
enic_cq_wq(struct enic * enic,unsigned int wq)3439c067b84SDoug Ambrisko static inline unsigned int enic_cq_wq(struct enic *enic, unsigned int wq)
3449c067b84SDoug Ambrisko {
3459c067b84SDoug Ambrisko 	return enic->rq_count + wq;
3469c067b84SDoug Ambrisko }
3479c067b84SDoug Ambrisko 
3489c067b84SDoug Ambrisko static inline uint32_t
enic_ring_incr(uint32_t n_descriptors,uint32_t idx)3499c067b84SDoug Ambrisko enic_ring_incr(uint32_t n_descriptors, uint32_t idx)
3509c067b84SDoug Ambrisko {
3519c067b84SDoug Ambrisko 	idx++;
3529c067b84SDoug Ambrisko 	if (unlikely(idx == n_descriptors))
3539c067b84SDoug Ambrisko 		idx = 0;
3549c067b84SDoug Ambrisko 	return idx;
3559c067b84SDoug Ambrisko }
3569c067b84SDoug Ambrisko 
3579c067b84SDoug Ambrisko int enic_setup_finish(struct enic *enic);
3589c067b84SDoug Ambrisko void enic_start_wq(struct enic *enic, uint16_t queue_idx);
3599c067b84SDoug Ambrisko int enic_stop_wq(struct enic *enic, uint16_t queue_idx);
3609c067b84SDoug Ambrisko void enic_start_rq(struct enic *enic, uint16_t queue_idx);
361*0acab8b3SDoug Ambrisko int enic_stop_rq(struct enic *enic, uint16_t queue_idx);
362*0acab8b3SDoug Ambrisko void enic_dev_disable(struct enic *enic);
3639c067b84SDoug Ambrisko int enic_enable(struct enic *enic);
3649c067b84SDoug Ambrisko int enic_disable(struct enic *enic);
3659c067b84SDoug Ambrisko int enic_link_update(struct enic *enic);
3669c067b84SDoug Ambrisko bool enic_use_vector_rx_handler(struct enic *enic);
3679c067b84SDoug Ambrisko void enic_fdir_info(struct enic *enic);
3689c067b84SDoug Ambrisko void enic_prep_wq_for_simple_tx(struct enic *, uint16_t);
3699c067b84SDoug Ambrisko 
3709c067b84SDoug Ambrisko struct enic_ring {
3719c067b84SDoug Ambrisko 	uint64_t		paddr;
3729c067b84SDoug Ambrisko 	caddr_t			 vaddr;
3739c067b84SDoug Ambrisko 	struct enic_softc	*softc;
3749c067b84SDoug Ambrisko 	uint32_t		ring_size; /* Must be a power of two */
3759c067b84SDoug Ambrisko 	uint16_t		id;	   /* Logical ID */
3769c067b84SDoug Ambrisko 	uint16_t		phys_id;
3779c067b84SDoug Ambrisko };
3789c067b84SDoug Ambrisko 
3799c067b84SDoug Ambrisko struct enic_cp_ring {
3809c067b84SDoug Ambrisko 	struct enic_ring	ring;
3819c067b84SDoug Ambrisko 	struct if_irq		irq;
3829c067b84SDoug Ambrisko 	uint32_t		cons;
3839c067b84SDoug Ambrisko 	bool			v_bit;	  /* Value of valid bit */
3849c067b84SDoug Ambrisko 	struct ctx_hw_stats	*stats;
3859c067b84SDoug Ambrisko 	uint32_t		stats_ctx_id;
3869c067b84SDoug Ambrisko 	uint32_t		last_idx; /* Used by RX rings only
3879c067b84SDoug Ambrisko 					   * set to the last read pidx
3889c067b84SDoug Ambrisko 					   */
3899c067b84SDoug Ambrisko };
3909c067b84SDoug Ambrisko 
3919c067b84SDoug Ambrisko #endif /* _ENIC_H_ */
392