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