#ifndef _I40E_SW_H
#define _I40E_SW_H
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/types.h>
#include <sys/conf.h>
#include <sys/debug.h>
#include <sys/stropts.h>
#include <sys/stream.h>
#include <sys/strsun.h>
#include <sys/strlog.h>
#include <sys/kmem.h>
#include <sys/stat.h>
#include <sys/kstat.h>
#include <sys/modctl.h>
#include <sys/errno.h>
#include <sys/dlpi.h>
#include <sys/mac_provider.h>
#include <sys/mac_ether.h>
#include <sys/vlan.h>
#include <sys/ddi.h>
#include <sys/sunddi.h>
#include <sys/pci.h>
#include <sys/pcie.h>
#include <sys/sdt.h>
#include <sys/ethernet.h>
#include <sys/pattr.h>
#include <sys/strsubr.h>
#include <sys/netlb.h>
#include <sys/random.h>
#include <inet/common.h>
#include <inet/tcp.h>
#include <inet/ip.h>
#include <inet/mi.h>
#include <inet/nd.h>
#include <netinet/udp.h>
#include <netinet/sctp.h>
#include <sys/bitmap.h>
#include <sys/cpuvar.h>
#include <sys/ddifm.h>
#include <sys/fm/protocol.h>
#include <sys/fm/util.h>
#include <sys/disp.h>
#include <sys/fm/io/ddi.h>
#include <sys/list.h>
#include <sys/debug.h>
#include <sys/sdt.h>
#include <sys/ddi_ufm.h>
#include "i40e_type.h"
#include "i40e_osdep.h"
#include "i40e_prototype.h"
#include "i40e_xregs.h"
#define I40E_MODULE_NAME "i40e"
#define I40E_ADAPTER_REGSET 1
#define I40E_MIN_TX_RING_SIZE 64
#define I40E_MAX_TX_RING_SIZE 4096
#define I40E_DEF_TX_RING_SIZE 1024
#define I40E_MIN_NUM_RX_GROUPS 1
#define I40E_MAX_NUM_RX_GROUPS 32
#define I40E_DEF_NUM_RX_GROUPS 16
#define I40E_MIN_RX_RING_SIZE 64
#define I40E_MAX_RX_RING_SIZE 4096
#define I40E_DEF_RX_RING_SIZE 1024
#define I40E_DESC_ALIGN 32
#define I40E_ADMINQ_BUFSZ 4096
#define I40E_MAX_ADMINQ_SIZE 1024
#define I40E_DEF_ADMINQ_SIZE 256
#define I40E_MIN_RX_LIMIT_PER_INTR 16
#define I40E_MAX_RX_LIMIT_PER_INTR 4096
#define I40E_DEF_RX_LIMIT_PER_INTR 256
#define I40E_MAX_MTU 9706
#define I40E_MIN_MTU ETHERMIN
#define I40E_DEF_MTU ETHERMTU
#define I40E_MIN_ITR 0x0000
#define I40E_MAX_ITR 0x0FF0
#define I40E_DEF_RX_ITR 0x0019
#define I40E_DEF_TX_ITR 0x0064
#define I40E_DEF_OTHER_ITR 0x00FA
typedef enum i40e_itr_index {
I40E_ITR_INDEX_RX = 0x0,
I40E_ITR_INDEX_TX = 0x1,
I40E_ITR_INDEX_OTHER = 0x2,
I40E_ITR_INDEX_NONE = 0x3
} i40e_itr_index_t;
#define I40E_LSO_MAXLEN (64 * 1024)
#define I40E_CYCLIC_PERIOD NANOSEC
#define I40E_DRAIN_RX_WAIT (500 * MILLISEC)
#define I40E_QUEUE_TYPE_EOL 0x7FF
#define I40E_BUF_IPHDR_ALIGNMENT 2
#define I40E_TX_MAX_COOKIE 8
#define I40E_TX_LSO_MAX_COOKIE 32
#define I40E_MIN_TX_BLOCK_THRESH I40E_TX_MAX_COOKIE
#define I40E_DEF_TX_BLOCK_THRESH I40E_MIN_TX_BLOCK_THRESH
#define I40E_MIN_RX_DMA_THRESH 0
#define I40E_DEF_RX_DMA_THRESH 256
#define I40E_MAX_RX_DMA_THRESH INT32_MAX
#define I40E_MIN_TX_DMA_THRESH 0
#define I40E_DEF_TX_DMA_THRESH 256
#define I40E_MAX_TX_DMA_THRESH INT32_MAX
#define I40E_MAX_TX_BUFSZ 0x0000000000003FFFull
#define I40E_HW_CAP_DEFAULT 40
#define I40E_SWITCH_CAP_DEFAULT 25
#define I40E_HMC_RX_CTX_UNIT 128
#define I40E_HMC_RX_DBUFF_MIN 1024
#define I40E_HMC_RX_DBUFF_MAX (16 * 1024 - 128)
#define I40E_HMC_RX_DTYPE_NOSPLIT 0
#define I40E_HMC_RX_DSIZE_32BYTE 1
#define I40E_HMC_RX_CRCSTRIP_ENABLE 1
#define I40E_HMC_RX_FC_DISABLE 0
#define I40E_HMC_RX_L2TAGORDER 1
#define I40E_HMC_RX_HDRSPLIT_DISABLE 0
#define I40E_HMC_RX_INVLAN_DONTSTRIP 0
#define I40E_HMC_RX_TPH_DISABLE 0
#define I40E_HMC_RX_LOWRXQ_NOINTR 0
#define I40E_HMC_RX_PREFENA 1
#define I40E_HMC_TX_CTX_UNIT 128
#define I40E_HMC_TX_NEW_CONTEXT 1
#define I40E_HMC_TX_FC_DISABLE 0
#define I40E_HMC_TX_TS_DISABLE 0
#define I40E_HMC_TX_FD_DISABLE 0
#define I40E_HMC_TX_ALT_VLAN_DISABLE 0
#define I40E_HMC_TX_WB_ENABLE 1
#define I40E_HMC_TX_TPH_DISABLE 0
#define I40E_RX_ERR_BITS ((1 << I40E_RX_DESC_ERROR_RXE_SHIFT) | \
(1 << I40E_RX_DESC_ERROR_OVERSIZE_SHIFT))
#define I40E_DDI_PROP_LEN 64
#define I40E_GROUP_NOMSIX 1
#define I40E_TRQPAIR_NOMSIX 1
#ifdef DEBUG
#define I40E_DMA_SYNC(handle, flag) ASSERT0(ddi_dma_sync( \
(handle)->dmab_dma_handle, 0, 0, \
(flag)))
#else
#define I40E_DMA_SYNC(handle, flag) ((void) ddi_dma_sync( \
(handle)->dmab_dma_handle, 0, 0, \
(flag)))
#endif
#define I40E_RING_WAIT_NTRIES 10
#define I40E_RING_WAIT_PAUSE 10
#define I40E_RING_ENABLE_GAP 50
#define I40E_PBANUM_LENGTH 12
#define I40E_PBANUM_STRLEN 13
#define I40E_710_MAX_TC_QUEUES 64
#define I40E_722_MAX_TC_QUEUES 128
#define I40E_HLUT_TABLE_SIZE 512
typedef enum i40e_attach_state {
I40E_ATTACH_PCI_CONFIG = 0x0001,
I40E_ATTACH_REGS_MAP = 0x0002,
I40E_ATTACH_PROPS = 0x0004,
I40E_ATTACH_ALLOC_INTR = 0x0008,
I40E_ATTACH_ALLOC_RINGSLOCKS = 0x0010,
I40E_ATTACH_ADD_INTR = 0x0020,
I40E_ATTACH_COMMON_CODE = 0x0040,
I40E_ATTACH_INIT = 0x0080,
I40E_ATTACH_STATS = 0x0200,
I40E_ATTACH_MAC = 0x0800,
I40E_ATTACH_ENABLE_INTR = 0x1000,
I40E_ATTACH_FM_INIT = 0x2000,
I40E_ATTACH_LINK_TIMER = 0x4000,
I40E_ATTACH_UFM_INIT = 0x8000,
} i40e_attach_state_t;
typedef enum i40e_state {
I40E_UNKNOWN = 0x00,
I40E_INITIALIZED = 0x01,
I40E_STARTED = 0x02,
I40E_SUSPENDED = 0x04,
I40E_STALL = 0x08,
I40E_OVERTEMP = 0x20,
I40E_INTR_ADJUST = 0x40,
I40E_ERROR = 0x80
} i40e_state_t;
typedef struct i40e_hw i40e_hw_t;
typedef struct i40e_aqc_switch_resource_alloc_element_resp i40e_switch_rsrc_t;
typedef struct i40e_dma_buffer {
caddr_t dmab_address;
uint64_t dmab_dma_address;
ddi_acc_handle_t dmab_acc_handle;
ddi_dma_handle_t dmab_dma_handle;
size_t dmab_size;
size_t dmab_len;
} i40e_dma_buffer_t;
typedef struct i40e_rx_control_block {
mblk_t *rcb_mp;
uint32_t rcb_ref;
i40e_dma_buffer_t rcb_dma;
frtn_t rcb_free_rtn;
struct i40e_rx_data *rcb_rxd;
} i40e_rx_control_block_t;
typedef enum {
I40E_TX_NONE,
I40E_TX_COPY,
I40E_TX_DMA,
I40E_TX_DESC,
} i40e_tx_type_t;
typedef struct i40e_tx_desc i40e_tx_desc_t;
typedef struct i40e_tx_context_desc i40e_tx_context_desc_t;
typedef union i40e_32byte_rx_desc i40e_rx_desc_t;
struct i40e_dma_bind_info {
caddr_t dbi_paddr;
size_t dbi_len;
};
typedef struct i40e_tx_control_block {
struct i40e_tx_control_block *tcb_next;
mblk_t *tcb_mp;
i40e_tx_type_t tcb_type;
ddi_dma_handle_t tcb_dma_handle;
ddi_dma_handle_t tcb_lso_dma_handle;
i40e_dma_buffer_t tcb_dma;
struct i40e_dma_bind_info *tcb_bind_info;
uint_t tcb_bind_ncookies;
boolean_t tcb_used_lso;
} i40e_tx_control_block_t;
typedef struct i40e_rx_data {
struct i40e *rxd_i40e;
i40e_dma_buffer_t rxd_desc_area;
i40e_rx_desc_t *rxd_desc_ring;
uint32_t rxd_desc_next;
kmutex_t rxd_free_lock;
i40e_rx_control_block_t *rxd_rcb_area;
i40e_rx_control_block_t **rxd_work_list;
i40e_rx_control_block_t **rxd_free_list;
uint32_t rxd_rcb_free;
uint32_t rxd_ring_size;
uint32_t rxd_free_list_size;
uint32_t rxd_rcb_pending;
boolean_t rxd_shutdown;
} i40e_rx_data_t;
typedef struct i40e_uaddr {
uint8_t iua_mac[ETHERADDRL];
int iua_vsi;
} i40e_uaddr_t;
typedef struct i40e_maddr {
uint8_t ima_mac[ETHERADDRL];
} i40e_maddr_t;
typedef struct i40e_rxq_stat {
kstat_named_t irxs_bytes;
kstat_named_t irxs_packets;
kstat_named_t irxs_rx_desc_error;
kstat_named_t irxs_rx_copy_nomem;
kstat_named_t irxs_rx_intr_limit;
kstat_named_t irxs_rx_bind_norcb;
kstat_named_t irxs_rx_bind_nomp;
kstat_named_t irxs_hck_v4hdrok;
kstat_named_t irxs_hck_l4hdrok;
kstat_named_t irxs_hck_unknown;
kstat_named_t irxs_hck_nol3l4p;
kstat_named_t irxs_hck_iperr;
kstat_named_t irxs_hck_eiperr;
kstat_named_t irxs_hck_l4err;
kstat_named_t irxs_hck_v6skip;
kstat_named_t irxs_hck_set;
kstat_named_t irxs_hck_miss;
} i40e_rxq_stat_t;
typedef struct i40e_txq_stat {
kstat_named_t itxs_bytes;
kstat_named_t itxs_packets;
kstat_named_t itxs_descriptors;
kstat_named_t itxs_recycled;
kstat_named_t itxs_force_copy;
kstat_named_t itxs_tso_force_copy;
kstat_named_t itxs_hck_nol2info;
kstat_named_t itxs_hck_nol3info;
kstat_named_t itxs_hck_nol4info;
kstat_named_t itxs_hck_badl3;
kstat_named_t itxs_hck_badl4;
kstat_named_t itxs_lso_nohck;
kstat_named_t itxs_bind_fails;
kstat_named_t itxs_tx_short;
kstat_named_t itxs_err_notcb;
kstat_named_t itxs_err_nodescs;
kstat_named_t itxs_err_context;
kstat_named_t itxs_num_unblocked;
} i40e_txq_stat_t;
typedef struct i40e_trqpair {
struct i40e *itrq_i40e;
kmutex_t itrq_intr_lock;
kcondvar_t itrq_intr_cv;
boolean_t itrq_intr_busy;
boolean_t itrq_intr_quiesce;
hrtime_t irtq_time_stopped;
kmutex_t itrq_rx_lock;
mac_ring_handle_t itrq_macrxring;
i40e_rx_data_t *itrq_rxdata;
uint64_t itrq_rxgen;
uint32_t itrq_index;
uint32_t itrq_rx_intrvec;
boolean_t itrq_intr_poll;
i40e_rxq_stat_t itrq_rxstat;
kstat_t *itrq_rxkstat;
kmutex_t itrq_tx_lock;
kcondvar_t itrq_tx_cv;
uint_t itrq_tx_active;
boolean_t itrq_tx_quiesce;
mac_ring_handle_t itrq_mactxring;
uint32_t itrq_tx_intrvec;
boolean_t itrq_tx_blocked;
uint32_t itrq_tx_ring_size;
uint32_t itrq_tx_free_list_size;
i40e_dma_buffer_t itrq_desc_area;
i40e_tx_desc_t *itrq_desc_ring;
volatile uint32_t *itrq_desc_wbhead;
uint32_t itrq_desc_head;
uint32_t itrq_desc_tail;
uint32_t itrq_desc_free;
kmutex_t itrq_tcb_lock;
i40e_tx_control_block_t *itrq_tcb_area;
i40e_tx_control_block_t **itrq_tcb_work_list;
i40e_tx_control_block_t **itrq_tcb_free_list;
uint32_t itrq_tcb_free;
i40e_txq_stat_t itrq_txstat;
kstat_t *itrq_txkstat;
} i40e_trqpair_t;
typedef struct i40e_vsi_stats {
uint64_t ivs_rx_bytes;
uint64_t ivs_rx_unicast;
uint64_t ivs_rx_multicast;
uint64_t ivs_rx_broadcast;
uint64_t ivs_rx_discards;
uint64_t ivs_rx_unknown_protocol;
uint64_t ivs_tx_bytes;
uint64_t ivs_tx_unicast;
uint64_t ivs_tx_multicast;
uint64_t ivs_tx_broadcast;
uint64_t ivs_tx_errors;
} i40e_vsi_stats_t;
typedef struct i40e_vsi_kstats {
kstat_named_t ivk_rx_bytes;
kstat_named_t ivk_rx_unicast;
kstat_named_t ivk_rx_multicast;
kstat_named_t ivk_rx_broadcast;
kstat_named_t ivk_rx_discards;
kstat_named_t ivk_rx_unknown_protocol;
kstat_named_t ivk_tx_bytes;
kstat_named_t ivk_tx_unicast;
kstat_named_t ivk_tx_multicast;
kstat_named_t ivk_tx_broadcast;
kstat_named_t ivk_tx_errors;
} i40e_vsi_kstats_t;
typedef struct i40e_pf_stats {
uint64_t ips_rx_bytes;
uint64_t ips_rx_unicast;
uint64_t ips_rx_multicast;
uint64_t ips_rx_broadcast;
uint64_t ips_tx_bytes;
uint64_t ips_tx_unicast;
uint64_t ips_tx_multicast;
uint64_t ips_tx_broadcast;
uint64_t ips_rx_size_64;
uint64_t ips_rx_size_127;
uint64_t ips_rx_size_255;
uint64_t ips_rx_size_511;
uint64_t ips_rx_size_1023;
uint64_t ips_rx_size_1522;
uint64_t ips_rx_size_9522;
uint64_t ips_tx_size_64;
uint64_t ips_tx_size_127;
uint64_t ips_tx_size_255;
uint64_t ips_tx_size_511;
uint64_t ips_tx_size_1023;
uint64_t ips_tx_size_1522;
uint64_t ips_tx_size_9522;
uint64_t ips_link_xon_rx;
uint64_t ips_link_xoff_rx;
uint64_t ips_link_xon_tx;
uint64_t ips_link_xoff_tx;
uint64_t ips_priority_xon_rx[8];
uint64_t ips_priority_xoff_rx[8];
uint64_t ips_priority_xon_tx[8];
uint64_t ips_priority_xoff_tx[8];
uint64_t ips_priority_xon_2_xoff[8];
uint64_t ips_crc_errors;
uint64_t ips_illegal_bytes;
uint64_t ips_mac_local_faults;
uint64_t ips_mac_remote_faults;
uint64_t ips_rx_length_errors;
uint64_t ips_rx_undersize;
uint64_t ips_rx_fragments;
uint64_t ips_rx_oversize;
uint64_t ips_rx_jabber;
uint64_t ips_rx_discards;
uint64_t ips_rx_vm_discards;
uint64_t ips_rx_short_discards;
uint64_t ips_tx_dropped_link_down;
uint64_t ips_rx_unknown_protocol;
uint64_t ips_rx_err1;
uint64_t ips_rx_err2;
} i40e_pf_stats_t;
typedef struct i40e_pf_kstats {
kstat_named_t ipk_rx_bytes;
kstat_named_t ipk_rx_unicast;
kstat_named_t ipk_rx_multicast;
kstat_named_t ipk_rx_broadcast;
kstat_named_t ipk_tx_bytes;
kstat_named_t ipk_tx_unicast;
kstat_named_t ipk_tx_multicast;
kstat_named_t ipk_tx_broadcast;
kstat_named_t ipk_rx_size_64;
kstat_named_t ipk_rx_size_127;
kstat_named_t ipk_rx_size_255;
kstat_named_t ipk_rx_size_511;
kstat_named_t ipk_rx_size_1023;
kstat_named_t ipk_rx_size_1522;
kstat_named_t ipk_rx_size_9522;
kstat_named_t ipk_tx_size_64;
kstat_named_t ipk_tx_size_127;
kstat_named_t ipk_tx_size_255;
kstat_named_t ipk_tx_size_511;
kstat_named_t ipk_tx_size_1023;
kstat_named_t ipk_tx_size_1522;
kstat_named_t ipk_tx_size_9522;
kstat_named_t ipk_link_xon_rx;
kstat_named_t ipk_link_xoff_rx;
kstat_named_t ipk_link_xon_tx;
kstat_named_t ipk_link_xoff_tx;
kstat_named_t ipk_priority_xon_rx[8];
kstat_named_t ipk_priority_xoff_rx[8];
kstat_named_t ipk_priority_xon_tx[8];
kstat_named_t ipk_priority_xoff_tx[8];
kstat_named_t ipk_priority_xon_2_xoff[8];
kstat_named_t ipk_crc_errors;
kstat_named_t ipk_illegal_bytes;
kstat_named_t ipk_mac_local_faults;
kstat_named_t ipk_mac_remote_faults;
kstat_named_t ipk_rx_length_errors;
kstat_named_t ipk_rx_undersize;
kstat_named_t ipk_rx_fragments;
kstat_named_t ipk_rx_oversize;
kstat_named_t ipk_rx_jabber;
kstat_named_t ipk_rx_discards;
kstat_named_t ipk_rx_vm_discards;
kstat_named_t ipk_rx_short_discards;
kstat_named_t ipk_tx_dropped_link_down;
kstat_named_t ipk_rx_unknown_protocol;
kstat_named_t ipk_rx_err1;
kstat_named_t ipk_rx_err2;
} i40e_pf_kstats_t;
typedef struct i40e_func_rsrc {
uint_t ifr_nrx_queue;
uint_t ifr_nrx_queue_used;
uint_t ifr_ntx_queue;
uint_t ifr_trx_queue_used;
uint_t ifr_nvsis;
uint_t ifr_nvsis_used;
uint_t ifr_nmacfilt;
uint_t ifr_nmacfilt_used;
uint_t ifr_nmcastfilt;
uint_t ifr_nmcastfilt_used;
} i40e_func_rsrc_t;
typedef struct i40e_vsi {
uint16_t iv_seid;
uint16_t iv_number;
kstat_t *iv_kstats;
i40e_vsi_stats_t iv_stats;
uint16_t iv_stats_id;
} i40e_vsi_t;
typedef struct i40e_rx_group {
uint32_t irg_index;
uint16_t irg_vsi_seid;
mac_group_handle_t irg_grp_hdl;
struct i40e *irg_i40e;
} i40e_rx_group_t;
typedef struct i40e {
list_node_t i40e_glink;
list_node_t i40e_dlink;
kmutex_t i40e_general_lock;
dev_info_t *i40e_dip;
int i40e_instance;
int i40e_fm_capabilities;
uint_t i40e_state;
i40e_attach_state_t i40e_attach_progress;
mac_handle_t i40e_mac_hdl;
ddi_periodic_t i40e_periodic_id;
struct i40e_hw i40e_hw_space;
struct i40e_osdep i40e_osdep_space;
struct i40e_aq_get_phy_abilities_resp i40e_phy;
void *i40e_aqbuf;
#define I40E_DEF_VSI_IDX 0
#define I40E_DEF_VSI(i40e) ((i40e)->i40e_vsis[I40E_DEF_VSI_IDX])
#define I40E_DEF_VSI_SEID(i40e) (I40E_DEF_VSI(i40e).iv_seid)
i40e_vsi_t i40e_vsis[I40E_MAX_NUM_RX_GROUPS];
uint16_t i40e_mac_seid;
uint16_t i40e_veb_seid;
uint16_t i40e_vsi_avail;
uint16_t i40e_vsi_used;
struct i40e_device *i40e_device;
i40e_func_rsrc_t i40e_resources;
uint16_t i40e_switch_rsrc_alloc;
uint16_t i40e_switch_rsrc_actual;
i40e_switch_rsrc_t *i40e_switch_rsrcs;
i40e_uaddr_t *i40e_uaddrs;
i40e_maddr_t *i40e_maddrs;
int i40e_mcast_promisc_count;
boolean_t i40e_promisc_on;
link_state_t i40e_link_state;
uint32_t i40e_link_speed;
link_duplex_t i40e_link_duplex;
link_fec_t i40e_fec_requested;
uint_t i40e_sdu;
uint_t i40e_frame_max;
i40e_trqpair_t *i40e_trqpairs;
boolean_t i40e_mr_enable;
uint_t i40e_num_trqpairs;
uint_t i40e_num_trqpairs_per_vsi;
uint_t i40e_other_itr;
i40e_rx_group_t *i40e_rx_groups;
uint_t i40e_num_rx_groups;
int i40e_num_rx_descs;
uint32_t i40e_rx_ring_size;
uint32_t i40e_rx_buf_size;
boolean_t i40e_rx_hcksum_enable;
uint32_t i40e_rx_dma_min;
uint32_t i40e_rx_limit_per_intr;
uint_t i40e_rx_itr;
int i40e_num_tx_descs;
uint32_t i40e_tx_ring_size;
uint32_t i40e_tx_buf_size;
uint32_t i40e_tx_block_thresh;
boolean_t i40e_tx_hcksum_enable;
boolean_t i40e_tx_lso_enable;
uint32_t i40e_tx_dma_min;
uint_t i40e_tx_itr;
uint_t i40e_intr_pri;
uint_t i40e_intr_force;
uint_t i40e_intr_type;
int i40e_intr_cap;
uint32_t i40e_intr_count;
uint32_t i40e_intr_count_max;
uint32_t i40e_intr_count_min;
size_t i40e_intr_size;
ddi_intr_handle_t *i40e_intr_handles;
ddi_cb_handle_t i40e_callback_handle;
ddi_dma_attr_t i40e_static_dma_attr;
ddi_dma_attr_t i40e_txbind_dma_attr;
ddi_dma_attr_t i40e_txbind_lso_dma_attr;
ddi_device_acc_attr_t i40e_desc_acc_attr;
ddi_device_acc_attr_t i40e_buf_acc_attr;
kmutex_t i40e_rx_pending_lock;
kcondvar_t i40e_rx_pending_cv;
uint32_t i40e_rx_pending;
kmutex_t i40e_stat_lock;
kstat_t *i40e_pf_kstat;
i40e_pf_stats_t i40e_pf_stat;
uint64_t i40e_s_link_status_errs;
uint32_t i40e_s_link_status_lasterr;
uint32_t i40e_led_status;
boolean_t i40e_led_saved;
ddi_ufm_handle_t *i40e_ufmh;
} i40e_t;
typedef struct i40e_device {
list_node_t id_link;
dev_info_t *id_parent;
uint_t id_pci_bus;
uint_t id_pci_device;
uint_t id_nfuncs;
uint_t id_nreg;
list_t id_i40e_list;
i40e_switch_rsrc_t *id_rsrcs;
uint_t id_rsrcs_alloc;
uint_t id_rsrcs_act;
} i40e_device_t;
#define I40E_INTR_NONE 0
#define I40E_INTR_MSIX 1
#define I40E_INTR_MSI 2
#define I40E_INTR_LEGACY 3
#define I40E_POLL_NULL -1
extern void i40e_error(i40e_t *, const char *, ...) __KPRINTFLIKE(2);
extern void i40e_notice(i40e_t *, const char *, ...) __KPRINTFLIKE(2);
extern void i40e_log(i40e_t *, const char *, ...) __KPRINTFLIKE(2);
extern void i40e_link_check(i40e_t *);
extern void i40e_update_mtu(i40e_t *);
extern int i40e_check_acc_handle(ddi_acc_handle_t);
extern int i40e_check_dma_handle(ddi_dma_handle_t);
extern void i40e_fm_ereport(i40e_t *, char *);
extern void i40e_intr_chip_init(i40e_t *);
extern void i40e_intr_chip_fini(i40e_t *);
extern uint_t i40e_intr_msix(void *, void *);
extern uint_t i40e_intr_msi(void *, void *);
extern uint_t i40e_intr_legacy(void *, void *);
extern void i40e_intr_io_enable_all(i40e_t *);
extern void i40e_intr_io_disable_all(i40e_t *);
extern void i40e_intr_io_clear_cause(i40e_t *);
extern void i40e_intr_rx_queue_disable(i40e_trqpair_t *);
extern void i40e_intr_rx_queue_enable(i40e_trqpair_t *);
extern void i40e_intr_set_itr(i40e_t *, i40e_itr_index_t, uint_t);
extern void i40e_intr_quiesce(i40e_trqpair_t *);
extern mblk_t *i40e_ring_rx(i40e_trqpair_t *, int);
extern mblk_t *i40e_ring_rx_poll(void *, int);
extern void i40e_rx_recycle(caddr_t);
extern boolean_t i40e_ring_tx_quiesce(i40e_trqpair_t *);
mblk_t *i40e_ring_tx(void *, mblk_t *);
extern void i40e_tx_recycle_ring(i40e_trqpair_t *);
extern void i40e_tx_cleanup_ring(i40e_trqpair_t *);
extern boolean_t i40e_stats_init(i40e_t *);
extern void i40e_stats_fini(i40e_t *);
extern boolean_t i40e_stat_vsi_init(i40e_t *, uint_t);
extern void i40e_stat_vsi_fini(i40e_t *, uint_t);
extern boolean_t i40e_stats_trqpair_init(i40e_trqpair_t *);
extern void i40e_stats_trqpair_fini(i40e_trqpair_t *);
extern int i40e_m_stat(void *, uint_t, uint64_t *);
extern int i40e_rx_ring_stat(mac_ring_driver_t, uint_t, uint64_t *);
extern int i40e_tx_ring_stat(mac_ring_driver_t, uint_t, uint64_t *);
extern mac_ether_media_t i40e_link_to_media(i40e_t *);
extern boolean_t i40e_register_mac(i40e_t *);
extern boolean_t i40e_start(i40e_t *);
extern void i40e_stop(i40e_t *);
extern int i40e_setup_ring(i40e_trqpair_t *);
extern boolean_t i40e_shutdown_ring(i40e_trqpair_t *);
extern void i40e_init_dma_attrs(i40e_t *, boolean_t);
extern boolean_t i40e_alloc_ring_mem(i40e_trqpair_t *);
extern void i40e_free_ring_mem(i40e_trqpair_t *, boolean_t);
#ifdef __cplusplus
}
#endif
#endif