Home | History | Annotate | Line # | Download | only in pci
if_enavar.h revision 1.3.2.1
      1  1.3.2.1  christos /*	$NetBSD: if_enavar.h,v 1.3.2.1 2019/06/10 22:07:16 christos Exp $	*/
      2      1.2  jdolecek 
      3      1.1  jdolecek /*-
      4      1.1  jdolecek  * BSD LICENSE
      5      1.1  jdolecek  *
      6      1.1  jdolecek  * Copyright (c) 2015-2017 Amazon.com, Inc. or its affiliates.
      7      1.1  jdolecek  * All rights reserved.
      8      1.1  jdolecek  *
      9      1.1  jdolecek  * Redistribution and use in source and binary forms, with or without
     10      1.1  jdolecek  * modification, are permitted provided that the following conditions
     11      1.1  jdolecek  * are met:
     12      1.1  jdolecek  *
     13      1.1  jdolecek  * 1. Redistributions of source code must retain the above copyright
     14      1.1  jdolecek  *    notice, this list of conditions and the following disclaimer.
     15      1.1  jdolecek  *
     16      1.1  jdolecek  * 2. Redistributions in binary form must reproduce the above copyright
     17      1.1  jdolecek  *    notice, this list of conditions and the following disclaimer in the
     18      1.1  jdolecek  *    documentation and/or other materials provided with the distribution.
     19      1.1  jdolecek  *
     20      1.1  jdolecek  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     21      1.1  jdolecek  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     22      1.1  jdolecek  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     23      1.1  jdolecek  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     24      1.1  jdolecek  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     25      1.1  jdolecek  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     26      1.1  jdolecek  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     27      1.1  jdolecek  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     28      1.1  jdolecek  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     29      1.1  jdolecek  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     30      1.1  jdolecek  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     31      1.1  jdolecek  *
     32      1.1  jdolecek  * $FreeBSD: head/sys/dev/ena/ena.h 333450 2018-05-10 09:06:21Z mw $
     33      1.1  jdolecek  *
     34      1.1  jdolecek  */
     35      1.1  jdolecek 
     36      1.1  jdolecek #ifndef ENA_H
     37      1.1  jdolecek #define ENA_H
     38      1.1  jdolecek 
     39      1.1  jdolecek #include <sys/types.h>
     40      1.1  jdolecek 
     41      1.2  jdolecek #include "external/bsd/ena-com/ena_com.h"
     42      1.2  jdolecek #include "external/bsd/ena-com/ena_eth_com.h"
     43      1.1  jdolecek 
     44      1.1  jdolecek #define DRV_MODULE_VER_MAJOR	0
     45      1.1  jdolecek #define DRV_MODULE_VER_MINOR	8
     46      1.1  jdolecek #define DRV_MODULE_VER_SUBMINOR 1
     47      1.1  jdolecek 
     48      1.1  jdolecek #define DRV_MODULE_NAME		"ena"
     49      1.1  jdolecek 
     50      1.1  jdolecek #ifndef DRV_MODULE_VERSION
     51      1.1  jdolecek #define DRV_MODULE_VERSION				\
     52  1.3.2.1  christos 	___STRING(DRV_MODULE_VER_MAJOR) "."		\
     53  1.3.2.1  christos 	___STRING(DRV_MODULE_VER_MINOR) "."		\
     54  1.3.2.1  christos 	___STRING(DRV_MODULE_VER_SUBMINOR)
     55      1.1  jdolecek #endif
     56      1.1  jdolecek #define DEVICE_NAME	"Elastic Network Adapter (ENA)"
     57      1.1  jdolecek #define DEVICE_DESC	"ENA adapter"
     58      1.1  jdolecek 
     59      1.1  jdolecek /* Calculate DMA mask - width for ena cannot exceed 48, so it is safe */
     60      1.1  jdolecek #define ENA_DMA_BIT_MASK(x)		((1ULL << (x)) - 1ULL)
     61      1.1  jdolecek 
     62      1.1  jdolecek /* 1 for AENQ + ADMIN */
     63      1.1  jdolecek #define	ENA_ADMIN_MSIX_VEC		1
     64      1.1  jdolecek #define	ENA_MAX_MSIX_VEC(io_queues)	(ENA_ADMIN_MSIX_VEC + (io_queues))
     65      1.1  jdolecek 
     66  1.3.2.1  christos #define	ENA_REG_BAR			PCI_BAR(0)
     67  1.3.2.1  christos #define	ENA_MEM_BAR			PCI_BAR(2)
     68      1.1  jdolecek 
     69      1.1  jdolecek #define	ENA_BUS_DMA_SEGS		32
     70      1.1  jdolecek 
     71      1.1  jdolecek #define	ENA_DEFAULT_RING_SIZE		1024
     72      1.1  jdolecek 
     73      1.1  jdolecek #define	ENA_RX_REFILL_THRESH_DIVIDER	8
     74      1.1  jdolecek 
     75      1.1  jdolecek #define	ENA_IRQNAME_SIZE		40
     76      1.1  jdolecek 
     77      1.1  jdolecek #define	ENA_PKT_MAX_BUFS 		19
     78      1.1  jdolecek 
     79      1.1  jdolecek #define	ENA_RX_RSS_TABLE_LOG_SIZE	7
     80      1.1  jdolecek #define	ENA_RX_RSS_TABLE_SIZE		(1 << ENA_RX_RSS_TABLE_LOG_SIZE)
     81      1.1  jdolecek 
     82      1.1  jdolecek #define	ENA_HASH_KEY_SIZE		40
     83      1.1  jdolecek 
     84      1.1  jdolecek #define	ENA_MAX_FRAME_LEN		10000
     85      1.1  jdolecek #define	ENA_MIN_FRAME_LEN 		60
     86      1.1  jdolecek 
     87      1.1  jdolecek #define ENA_TX_CLEANUP_THRESHOLD	128
     88      1.1  jdolecek 
     89      1.1  jdolecek #define DB_THRESHOLD	64
     90      1.1  jdolecek 
     91      1.1  jdolecek #define TX_COMMIT	32
     92      1.1  jdolecek  /*
     93      1.1  jdolecek  * TX budget for cleaning. It should be half of the RX budget to reduce amount
     94      1.1  jdolecek  *  of TCP retransmissions.
     95      1.1  jdolecek  */
     96      1.1  jdolecek #define TX_BUDGET	128
     97      1.1  jdolecek /* RX cleanup budget. -1 stands for infinity. */
     98      1.1  jdolecek #define RX_BUDGET	256
     99      1.1  jdolecek /*
    100      1.1  jdolecek  * How many times we can repeat cleanup in the io irq handling routine if the
    101      1.1  jdolecek  * RX or TX budget was depleted.
    102      1.1  jdolecek  */
    103      1.1  jdolecek #define CLEAN_BUDGET	8
    104      1.1  jdolecek 
    105      1.1  jdolecek #define RX_IRQ_INTERVAL 20
    106      1.1  jdolecek #define TX_IRQ_INTERVAL 50
    107      1.1  jdolecek 
    108      1.1  jdolecek #define	ENA_MIN_MTU		128
    109      1.1  jdolecek 
    110      1.1  jdolecek #define	ENA_TSO_MAXSIZE		65536
    111      1.1  jdolecek 
    112      1.1  jdolecek #define	ENA_MMIO_DISABLE_REG_READ	BIT(0)
    113      1.1  jdolecek 
    114      1.1  jdolecek #define	ENA_TX_RING_IDX_NEXT(idx, ring_size) (((idx) + 1) & ((ring_size) - 1))
    115      1.1  jdolecek 
    116      1.1  jdolecek #define	ENA_RX_RING_IDX_NEXT(idx, ring_size) (((idx) + 1) & ((ring_size) - 1))
    117      1.1  jdolecek 
    118      1.1  jdolecek #define	ENA_IO_TXQ_IDX(q)		(2 * (q))
    119      1.1  jdolecek #define	ENA_IO_RXQ_IDX(q)		(2 * (q) + 1)
    120      1.1  jdolecek 
    121      1.1  jdolecek #define	ENA_MGMNT_IRQ_IDX		0
    122      1.1  jdolecek #define	ENA_IO_IRQ_FIRST_IDX		1
    123      1.1  jdolecek #define	ENA_IO_IRQ_IDX(q)		(ENA_IO_IRQ_FIRST_IDX + (q))
    124      1.1  jdolecek 
    125      1.1  jdolecek /*
    126      1.1  jdolecek  * ENA device should send keep alive msg every 1 sec.
    127      1.1  jdolecek  * We wait for 6 sec just to be on the safe side.
    128      1.1  jdolecek  */
    129      1.1  jdolecek #define DEFAULT_KEEP_ALIVE_TO		(SBT_1S * 6)
    130      1.1  jdolecek 
    131      1.1  jdolecek /* Time in jiffies before concluding the transmitter is hung. */
    132      1.1  jdolecek #define DEFAULT_TX_CMP_TO		(SBT_1S * 5)
    133      1.1  jdolecek 
    134      1.1  jdolecek /* Number of queues to check for missing queues per timer tick */
    135      1.1  jdolecek #define DEFAULT_TX_MONITORED_QUEUES	(4)
    136      1.1  jdolecek 
    137      1.1  jdolecek /* Max number of timeouted packets before device reset */
    138      1.1  jdolecek #define DEFAULT_TX_CMP_THRESHOLD	(128)
    139      1.1  jdolecek 
    140      1.1  jdolecek /*
    141      1.1  jdolecek  * Supported PCI vendor and devices IDs
    142      1.1  jdolecek  */
    143      1.1  jdolecek #define	PCI_VENDOR_ID_AMAZON	0x1d0f
    144      1.1  jdolecek 
    145      1.1  jdolecek #define	PCI_DEV_ID_ENA_PF	0x0ec2
    146      1.1  jdolecek #define	PCI_DEV_ID_ENA_LLQ_PF	0x1ec2
    147      1.1  jdolecek #define	PCI_DEV_ID_ENA_VF	0xec20
    148      1.1  jdolecek #define	PCI_DEV_ID_ENA_LLQ_VF	0xec21
    149      1.1  jdolecek 
    150      1.3  jdolecek typedef __int64_t sbintime_t;
    151      1.3  jdolecek 
    152      1.1  jdolecek struct msix_entry {
    153      1.1  jdolecek 	int entry;
    154      1.1  jdolecek 	int vector;
    155      1.1  jdolecek };
    156      1.1  jdolecek 
    157      1.1  jdolecek typedef struct _ena_vendor_info_t {
    158      1.1  jdolecek 	unsigned int vendor_id;
    159      1.1  jdolecek 	unsigned int device_id;
    160      1.1  jdolecek 	unsigned int index;
    161      1.1  jdolecek } ena_vendor_info_t;
    162      1.1  jdolecek 
    163      1.1  jdolecek struct ena_que {
    164      1.1  jdolecek 	struct ena_adapter *adapter;
    165      1.1  jdolecek 	struct ena_ring *tx_ring;
    166      1.1  jdolecek 	struct ena_ring *rx_ring;
    167      1.1  jdolecek 	uint32_t id;
    168      1.1  jdolecek 	int cpu;
    169      1.1  jdolecek };
    170      1.1  jdolecek 
    171      1.1  jdolecek struct ena_tx_buffer {
    172      1.1  jdolecek 	struct mbuf *mbuf;
    173      1.1  jdolecek 	/* # of ena desc for this specific mbuf
    174      1.1  jdolecek 	 * (includes data desc and metadata desc) */
    175      1.1  jdolecek 	unsigned int tx_descs;
    176      1.1  jdolecek 	/* # of buffers used by this mbuf */
    177      1.1  jdolecek 	unsigned int num_of_bufs;
    178      1.1  jdolecek 	bus_dmamap_t map;
    179      1.1  jdolecek 
    180      1.1  jdolecek 	/* Used to detect missing tx packets */
    181      1.1  jdolecek 	struct bintime timestamp;
    182      1.1  jdolecek 	bool print_once;
    183      1.1  jdolecek 
    184      1.1  jdolecek 	struct ena_com_buf bufs[ENA_PKT_MAX_BUFS];
    185      1.1  jdolecek } __aligned(CACHE_LINE_SIZE);
    186      1.1  jdolecek 
    187      1.1  jdolecek struct ena_rx_buffer {
    188      1.1  jdolecek 	struct mbuf *mbuf;
    189      1.1  jdolecek 	bus_dmamap_t map;
    190      1.1  jdolecek 	struct ena_com_buf ena_buf;
    191      1.1  jdolecek } __aligned(CACHE_LINE_SIZE);
    192      1.1  jdolecek 
    193      1.1  jdolecek struct ena_stats_tx {
    194      1.3  jdolecek 	char name[16];
    195      1.2  jdolecek 	struct evcnt cnt;
    196      1.2  jdolecek 	struct evcnt bytes;
    197      1.2  jdolecek 	struct evcnt prepare_ctx_err;
    198      1.2  jdolecek 	struct evcnt dma_mapping_err;
    199      1.2  jdolecek 	struct evcnt doorbells;
    200      1.2  jdolecek 	struct evcnt missing_tx_comp;
    201      1.2  jdolecek 	struct evcnt bad_req_id;
    202      1.2  jdolecek 	struct evcnt collapse;
    203      1.2  jdolecek 	struct evcnt collapse_err;
    204      1.1  jdolecek };
    205      1.1  jdolecek 
    206      1.1  jdolecek struct ena_stats_rx {
    207      1.3  jdolecek 	char name[16];
    208      1.2  jdolecek 	struct evcnt cnt;
    209      1.2  jdolecek 	struct evcnt bytes;
    210      1.2  jdolecek 	struct evcnt refil_partial;
    211      1.2  jdolecek 	struct evcnt bad_csum;
    212      1.2  jdolecek 	struct evcnt mjum_alloc_fail;
    213      1.2  jdolecek 	struct evcnt mbuf_alloc_fail;
    214      1.2  jdolecek 	struct evcnt dma_mapping_err;
    215      1.2  jdolecek 	struct evcnt bad_desc_num;
    216      1.2  jdolecek 	struct evcnt bad_req_id;
    217      1.2  jdolecek 	struct evcnt empty_rx_ring;
    218      1.1  jdolecek };
    219      1.1  jdolecek 
    220      1.1  jdolecek struct ena_ring {
    221      1.1  jdolecek 	/* Holds the empty requests for TX/RX out of order completions */
    222      1.1  jdolecek 	union {
    223      1.1  jdolecek 		uint16_t *free_tx_ids;
    224      1.1  jdolecek 		uint16_t *free_rx_ids;
    225      1.1  jdolecek 	};
    226      1.1  jdolecek 	struct ena_com_dev *ena_dev;
    227      1.1  jdolecek 	struct ena_adapter *adapter;
    228      1.1  jdolecek 	struct ena_com_io_cq *ena_com_io_cq;
    229      1.1  jdolecek 	struct ena_com_io_sq *ena_com_io_sq;
    230      1.1  jdolecek 
    231      1.1  jdolecek 	uint16_t qid;
    232      1.1  jdolecek 
    233      1.1  jdolecek 	/* Determines if device will use LLQ or normal mode for TX */
    234      1.1  jdolecek 	enum ena_admin_placement_policy_type tx_mem_queue_type;
    235      1.1  jdolecek 	/* The maximum length the driver can push to the device (For LLQ) */
    236      1.1  jdolecek 	uint8_t tx_max_header_size;
    237      1.1  jdolecek 
    238      1.1  jdolecek 	struct ena_com_rx_buf_info ena_bufs[ENA_PKT_MAX_BUFS];
    239      1.1  jdolecek 
    240      1.1  jdolecek 	/*
    241      1.1  jdolecek 	 * Fields used for Adaptive Interrupt Modulation - to be implemented in
    242      1.1  jdolecek 	 * the future releases
    243      1.1  jdolecek 	 */
    244      1.1  jdolecek 	uint32_t  smoothed_interval;
    245      1.1  jdolecek 	enum ena_intr_moder_level moder_tbl_idx;
    246      1.1  jdolecek 
    247      1.1  jdolecek 	struct ena_que *que;
    248      1.2  jdolecek #ifdef LRO
    249      1.1  jdolecek 	struct lro_ctrl lro;
    250      1.2  jdolecek #endif
    251      1.1  jdolecek 
    252      1.1  jdolecek 	uint16_t next_to_use;
    253      1.1  jdolecek 	uint16_t next_to_clean;
    254      1.1  jdolecek 
    255      1.1  jdolecek 	union {
    256      1.1  jdolecek 		struct ena_tx_buffer *tx_buffer_info; /* contex of tx packet */
    257      1.1  jdolecek 		struct ena_rx_buffer *rx_buffer_info; /* contex of rx packet */
    258      1.1  jdolecek 	};
    259      1.1  jdolecek 	int ring_size; /* number of tx/rx_buffer_info's entries */
    260      1.1  jdolecek 
    261      1.1  jdolecek 	struct buf_ring *br; /* only for TX */
    262      1.1  jdolecek 
    263      1.2  jdolecek 	kmutex_t ring_mtx;
    264      1.1  jdolecek 	char mtx_name[16];
    265      1.1  jdolecek 
    266      1.1  jdolecek 	union {
    267      1.1  jdolecek 		struct {
    268      1.2  jdolecek 			struct work enqueue_task;
    269      1.2  jdolecek 			struct workqueue *enqueue_tq;
    270      1.1  jdolecek 		};
    271      1.1  jdolecek 		struct {
    272      1.2  jdolecek 			struct work cmpl_task;
    273      1.2  jdolecek 			struct workqueue *cmpl_tq;
    274      1.1  jdolecek 		};
    275      1.1  jdolecek 	};
    276  1.3.2.1  christos 	u_int task_pending;
    277      1.1  jdolecek 
    278      1.1  jdolecek 	union {
    279      1.1  jdolecek 		struct ena_stats_tx tx_stats;
    280      1.1  jdolecek 		struct ena_stats_rx rx_stats;
    281      1.1  jdolecek 	};
    282      1.1  jdolecek 
    283      1.1  jdolecek 	int empty_rx_queue;
    284      1.1  jdolecek } __aligned(CACHE_LINE_SIZE);
    285      1.1  jdolecek 
    286      1.1  jdolecek struct ena_stats_dev {
    287      1.3  jdolecek 	char name[16];
    288      1.2  jdolecek 	struct evcnt wd_expired;
    289      1.2  jdolecek 	struct evcnt interface_up;
    290      1.2  jdolecek 	struct evcnt interface_down;
    291      1.2  jdolecek 	struct evcnt admin_q_pause;
    292      1.1  jdolecek };
    293      1.1  jdolecek 
    294      1.1  jdolecek struct ena_hw_stats {
    295      1.3  jdolecek 	char name[16];
    296      1.2  jdolecek 	struct evcnt rx_packets;
    297      1.2  jdolecek 	struct evcnt tx_packets;
    298      1.1  jdolecek 
    299      1.2  jdolecek 	struct evcnt rx_bytes;
    300      1.2  jdolecek 	struct evcnt tx_bytes;
    301      1.1  jdolecek 
    302      1.2  jdolecek 	struct evcnt rx_drops;
    303      1.1  jdolecek };
    304      1.1  jdolecek 
    305      1.1  jdolecek /* Board specific private data structure */
    306      1.1  jdolecek struct ena_adapter {
    307      1.1  jdolecek 	struct ena_com_dev *ena_dev;
    308      1.1  jdolecek 
    309      1.1  jdolecek 	/* OS defined structs */
    310      1.1  jdolecek 	device_t pdev;
    311      1.2  jdolecek         struct ethercom sc_ec;
    312      1.2  jdolecek 	struct ifnet *ifp;		/* set to point to sc_ec */
    313      1.1  jdolecek 	struct ifmedia	media;
    314      1.1  jdolecek 
    315      1.1  jdolecek 	/* OS resources */
    316      1.2  jdolecek 	kmutex_t global_mtx;
    317      1.2  jdolecek 	krwlock_t ioctl_sx;
    318      1.1  jdolecek 
    319      1.3  jdolecek 	void *sc_ihs[ENA_MAX_MSIX_VEC(ENA_MAX_NUM_IO_QUEUES)];
    320      1.3  jdolecek 	pci_intr_handle_t *sc_intrs;
    321      1.3  jdolecek 	int sc_nintrs;
    322      1.3  jdolecek 	struct pci_attach_args sc_pa;
    323      1.3  jdolecek 
    324      1.3  jdolecek 	/* Registers */
    325      1.3  jdolecek 	bus_space_handle_t sc_bhandle;
    326      1.3  jdolecek 	bus_space_tag_t	sc_btag;
    327      1.1  jdolecek 
    328      1.2  jdolecek 	/* DMA tag used throughout the driver adapter for Tx and Rx */
    329      1.2  jdolecek 	bus_dma_tag_t sc_dmat;
    330      1.1  jdolecek 	int dma_width;
    331      1.1  jdolecek 
    332      1.1  jdolecek 	uint32_t max_mtu;
    333      1.1  jdolecek 
    334      1.1  jdolecek 	uint16_t max_tx_sgl_size;
    335      1.1  jdolecek 	uint16_t max_rx_sgl_size;
    336      1.1  jdolecek 
    337      1.1  jdolecek 	uint32_t tx_offload_cap;
    338      1.1  jdolecek 
    339      1.1  jdolecek 	/* Tx fast path data */
    340      1.1  jdolecek 	int num_queues;
    341      1.1  jdolecek 
    342      1.1  jdolecek 	unsigned int tx_ring_size;
    343      1.1  jdolecek 	unsigned int rx_ring_size;
    344      1.1  jdolecek 
    345      1.1  jdolecek 	/* RSS*/
    346      1.1  jdolecek 	uint8_t	rss_ind_tbl[ENA_RX_RSS_TABLE_SIZE];
    347      1.1  jdolecek 	bool rss_support;
    348      1.1  jdolecek 
    349      1.1  jdolecek 	uint8_t mac_addr[ETHER_ADDR_LEN];
    350      1.1  jdolecek 	/* mdio and phy*/
    351      1.1  jdolecek 
    352      1.1  jdolecek 	bool link_status;
    353      1.1  jdolecek 	bool trigger_reset;
    354      1.1  jdolecek 	bool up;
    355      1.1  jdolecek 	bool running;
    356      1.1  jdolecek 
    357      1.1  jdolecek 	/* Queue will represent one TX and one RX ring */
    358      1.1  jdolecek 	struct ena_que que[ENA_MAX_NUM_IO_QUEUES]
    359      1.1  jdolecek 	    __aligned(CACHE_LINE_SIZE);
    360      1.1  jdolecek 
    361      1.1  jdolecek 	/* TX */
    362      1.1  jdolecek 	struct ena_ring tx_ring[ENA_MAX_NUM_IO_QUEUES]
    363      1.1  jdolecek 	    __aligned(CACHE_LINE_SIZE);
    364      1.1  jdolecek 
    365      1.1  jdolecek 	/* RX */
    366      1.1  jdolecek 	struct ena_ring rx_ring[ENA_MAX_NUM_IO_QUEUES]
    367      1.1  jdolecek 	    __aligned(CACHE_LINE_SIZE);
    368      1.1  jdolecek 
    369      1.1  jdolecek 	/* Timer service */
    370      1.1  jdolecek 	struct callout timer_service;
    371      1.3  jdolecek 	sbintime_t keep_alive_timestamp;
    372      1.1  jdolecek 	uint32_t next_monitored_tx_qid;
    373      1.2  jdolecek 	struct work reset_task;
    374      1.2  jdolecek 	struct workqueue *reset_tq;
    375      1.1  jdolecek 	int wd_active;
    376      1.3  jdolecek 	sbintime_t keep_alive_timeout;
    377      1.3  jdolecek 	sbintime_t missing_tx_timeout;
    378      1.1  jdolecek 	uint32_t missing_tx_max_queues;
    379      1.1  jdolecek 	uint32_t missing_tx_threshold;
    380      1.1  jdolecek 
    381      1.1  jdolecek 	/* Statistics */
    382      1.1  jdolecek 	struct ena_stats_dev dev_stats;
    383      1.1  jdolecek 	struct ena_hw_stats hw_stats;
    384      1.1  jdolecek 
    385      1.1  jdolecek 	enum ena_regs_reset_reason_types reset_reason;
    386      1.1  jdolecek };
    387      1.1  jdolecek 
    388      1.2  jdolecek #define	ENA_RING_MTX_LOCK(_ring)	mutex_enter(&(_ring)->ring_mtx)
    389      1.2  jdolecek #define	ENA_RING_MTX_TRYLOCK(_ring)	mutex_tryenter(&(_ring)->ring_mtx)
    390      1.2  jdolecek #define	ENA_RING_MTX_UNLOCK(_ring)	mutex_exit(&(_ring)->ring_mtx)
    391      1.1  jdolecek 
    392      1.1  jdolecek static inline int ena_mbuf_count(struct mbuf *mbuf)
    393      1.1  jdolecek {
    394      1.1  jdolecek 	int count = 1;
    395      1.1  jdolecek 
    396      1.1  jdolecek 	while ((mbuf = mbuf->m_next) != NULL)
    397      1.1  jdolecek 		++count;
    398      1.1  jdolecek 
    399      1.1  jdolecek 	return count;
    400      1.1  jdolecek }
    401      1.1  jdolecek 
    402      1.3  jdolecek /* provide FreeBSD-compatible macros */
    403      1.3  jdolecek #define	if_getcapenable(ifp)		(ifp)->if_capenable
    404      1.3  jdolecek #define	if_setcapenable(ifp, s)		SET((ifp)->if_capenable, s)
    405      1.3  jdolecek #define if_getcapabilities(ifp)		(ifp)->if_capabilities
    406      1.3  jdolecek #define if_setcapabilities(ifp, s)	SET((ifp)->if_capabilities, s)
    407      1.3  jdolecek #define if_setcapabilitiesbit(ifp, s, c) do {	\
    408      1.3  jdolecek 		CLR((ifp)->if_capabilities, c);	\
    409      1.3  jdolecek 		SET((ifp)->if_capabilities, s);	\
    410      1.3  jdolecek 	} while (0)
    411      1.3  jdolecek #define	if_getsoftc(ifp)		(ifp)->if_softc
    412      1.3  jdolecek #define if_setmtu(ifp, new_mtu)		(ifp)->if_mtu = (new_mtu)
    413      1.3  jdolecek #define if_getdrvflags(ifp)		(ifp)->if_flags
    414      1.3  jdolecek #define if_setdrvflagbits(ifp, s, c)	do {	\
    415      1.3  jdolecek 		CLR((ifp)->if_flags, c);	\
    416      1.3  jdolecek 		SET((ifp)->if_flags, s);	\
    417      1.3  jdolecek 	} while (0)
    418      1.3  jdolecek #define	if_setflags(ifp, s)		SET((ifp)->if_flags, s)
    419      1.3  jdolecek #define if_sethwassistbits(ifp, s, c)	do {		\
    420      1.3  jdolecek 		CLR((ifp)->if_csum_flags_rx, c);	\
    421      1.3  jdolecek 		SET((ifp)->if_csum_flags_rx, s);	\
    422      1.3  jdolecek 	} while (0)
    423      1.3  jdolecek #define if_clearhwassist(ifp)		(ifp)->if_csum_flags_rx = 0
    424      1.3  jdolecek #define if_setbaudrate(ifp, r)		(ifp)->if_baudrate = (r)
    425      1.3  jdolecek #define if_setdev(ifp, dev)		do { } while (0)
    426      1.3  jdolecek #define if_setsoftc(ifp, softc)		(ifp)->if_softc = (softc)
    427      1.3  jdolecek #define if_setinitfn(ifp, initfn)	(ifp)->if_init = (initfn)
    428      1.3  jdolecek #define if_settransmitfn(ifp, txfn)	(ifp)->if_transmit = (txfn)
    429      1.3  jdolecek #define if_setioctlfn(ifp, ioctlfn)	(ifp)->if_ioctl = (ioctlfn)
    430      1.3  jdolecek #define if_setsendqlen(ifp, sqlen)	\
    431  1.3.2.1  christos 	IFQ_SET_MAXLEN(&(ifp)->if_snd, uimax(sqlen, IFQ_MAXLEN))
    432      1.3  jdolecek #define if_setsendqready(ifp)		IFQ_SET_READY(&(ifp)->if_snd)
    433      1.3  jdolecek #define if_setifheaderlen(ifp, len)	(ifp)->if_hdrlen = (len)
    434      1.3  jdolecek 
    435      1.3  jdolecek #define	SBT_1S	((sbintime_t)1 << 32)
    436      1.3  jdolecek #define bintime_clear(a)	((a)->sec = (a)->frac = 0)
    437      1.3  jdolecek #define	bintime_isset(a)	((a)->sec || (a)->frac)
    438      1.3  jdolecek 
    439      1.3  jdolecek static __inline sbintime_t
    440      1.3  jdolecek bttosbt(const struct bintime _bt)
    441      1.3  jdolecek {
    442      1.3  jdolecek 	return (((sbintime_t)_bt.sec << 32) + (_bt.frac >> 32));
    443      1.3  jdolecek }
    444      1.3  jdolecek 
    445      1.3  jdolecek static __inline sbintime_t
    446      1.3  jdolecek getsbinuptime(void)
    447      1.3  jdolecek {
    448      1.3  jdolecek 	struct bintime _bt;
    449      1.3  jdolecek 
    450      1.3  jdolecek 	getbinuptime(&_bt);
    451      1.3  jdolecek 	return (bttosbt(_bt));
    452      1.3  jdolecek }
    453      1.3  jdolecek 
    454      1.3  jdolecek /* Intentionally non-atomic, it's just unnecessary overhead */
    455      1.3  jdolecek #define counter_u64_add(x, cnt)			(x).ev_count += (cnt)
    456      1.3  jdolecek #define counter_u64_zero(x)			(x).ev_count = 0
    457      1.3  jdolecek #define counter_u64_free(x)			evcnt_detach(&(x))
    458      1.3  jdolecek 
    459      1.3  jdolecek #define counter_u64_add_protected(x, cnt)	(x).ev_count += (cnt)
    460      1.3  jdolecek #define counter_enter()				do {} while (0)
    461      1.3  jdolecek #define counter_exit()				do {} while (0)
    462      1.3  jdolecek 
    463      1.3  jdolecek /* Misc other constants */
    464      1.3  jdolecek #define	mp_ncpus			ncpu
    465      1.3  jdolecek #define osreldate			__NetBSD_Version__
    466      1.3  jdolecek 
    467      1.3  jdolecek /*
    468      1.3  jdolecek  * XXX XXX XXX just to make compile, must provide replacement XXX XXX XXX
    469      1.3  jdolecek  * Other than that, TODO:
    470      1.3  jdolecek  * - decide whether to import <sys/buf_ring.h>
    471      1.3  jdolecek  * - recheck the M_CSUM/IPCAP mapping
    472      1.3  jdolecek  * - recheck workqueue use - FreeBSD taskqueues might have different semantics
    473      1.3  jdolecek  */
    474      1.3  jdolecek #define buf_ring_alloc(a, b, c, d)	(void *)&a
    475      1.3  jdolecek #define drbr_free(ifp, b)		do { } while (0)
    476  1.3.2.1  christos #define drbr_flush(ifp, b)		IFQ_PURGE(&(ifp)->if_snd)
    477  1.3.2.1  christos #define drbr_advance(ifp, b)					\
    478  1.3.2.1  christos 	({							\
    479  1.3.2.1  christos 		struct mbuf *__m;				\
    480  1.3.2.1  christos 		IFQ_DEQUEUE(&(ifp)->if_snd, __m);		\
    481  1.3.2.1  christos 		__m;						\
    482  1.3.2.1  christos 	})
    483      1.3  jdolecek #define drbr_putback(ifp, b, m)		do { } while (0)
    484  1.3.2.1  christos #define drbr_empty(ifp, b)		IFQ_IS_EMPTY(&(ifp)->if_snd)
    485  1.3.2.1  christos #define drbr_peek(ifp, b)					\
    486  1.3.2.1  christos 	({							\
    487  1.3.2.1  christos 		struct mbuf *__m;				\
    488  1.3.2.1  christos 		IFQ_POLL(&(ifp)->if_snd, __m);			\
    489  1.3.2.1  christos 		__m;						\
    490  1.3.2.1  christos 	})
    491  1.3.2.1  christos #define drbr_enqueue(ifp, b, m)					\
    492  1.3.2.1  christos 	({							\
    493  1.3.2.1  christos 		int __err;					\
    494  1.3.2.1  christos 		IFQ_ENQUEUE(&(ifp)->if_snd, m, __err);		\
    495  1.3.2.1  christos 		__err;						\
    496  1.3.2.1  christos 	})
    497      1.3  jdolecek #define m_getjcl(a, b, c, d)		NULL
    498      1.3  jdolecek #define MJUM16BYTES			MCLBYTES
    499  1.3.2.1  christos #define m_append(m, len, cp)		ena_m_append(m, len, cp)
    500  1.3.2.1  christos #define m_collapse(m, how, maxfrags)	m_defrag(m, how)	/* XXX */
    501      1.3  jdolecek /* XXX XXX XXX */
    502      1.3  jdolecek 
    503  1.3.2.1  christos static inline int
    504  1.3.2.1  christos ena_m_append(struct mbuf *m0, int len, const void *cpv)
    505  1.3.2.1  christos {
    506  1.3.2.1  christos 	struct mbuf *m, *n;
    507  1.3.2.1  christos 	int remainder, space;
    508  1.3.2.1  christos 	const char *cp = cpv;
    509  1.3.2.1  christos 
    510  1.3.2.1  christos 	KASSERT(len != M_COPYALL);
    511  1.3.2.1  christos 	for (m = m0; m->m_next != NULL; m = m->m_next)
    512  1.3.2.1  christos 		continue;
    513  1.3.2.1  christos 	remainder = len;
    514  1.3.2.1  christos 	space = M_TRAILINGSPACE(m);
    515  1.3.2.1  christos 	if (space > 0) {
    516  1.3.2.1  christos 		/*
    517  1.3.2.1  christos 		 * Copy into available space.
    518  1.3.2.1  christos 		 */
    519  1.3.2.1  christos 		if (space > remainder)
    520  1.3.2.1  christos 			space = remainder;
    521  1.3.2.1  christos 		memmove(mtod(m, char *) + m->m_len, cp, space);
    522  1.3.2.1  christos 		m->m_len += space;
    523  1.3.2.1  christos 		cp = cp + space, remainder -= space;
    524  1.3.2.1  christos 	}
    525  1.3.2.1  christos 	while (remainder > 0) {
    526  1.3.2.1  christos 		/*
    527  1.3.2.1  christos 		 * Allocate a new mbuf; could check space
    528  1.3.2.1  christos 		 * and allocate a cluster instead.
    529  1.3.2.1  christos 		 */
    530  1.3.2.1  christos 		n = m_get(M_DONTWAIT, m->m_type);
    531  1.3.2.1  christos 		if (n == NULL)
    532  1.3.2.1  christos 			break;
    533  1.3.2.1  christos 		n->m_len = uimin(MLEN, remainder);
    534  1.3.2.1  christos 		memmove(mtod(n, void *), cp, n->m_len);
    535  1.3.2.1  christos 		cp += n->m_len, remainder -= n->m_len;
    536  1.3.2.1  christos 		m->m_next = n;
    537  1.3.2.1  christos 		m = n;
    538  1.3.2.1  christos 	}
    539  1.3.2.1  christos 	if (m0->m_flags & M_PKTHDR)
    540  1.3.2.1  christos 		m0->m_pkthdr.len += len - remainder;
    541  1.3.2.1  christos 	return (remainder == 0);
    542  1.3.2.1  christos }
    543      1.1  jdolecek #endif /* !(ENA_H) */
    544