13c0086b8SZbigniew Bodek /* 23c0086b8SZbigniew Bodek * Copyright (C) 2015 Cavium Inc. 33c0086b8SZbigniew Bodek * All rights reserved. 43c0086b8SZbigniew Bodek * 53c0086b8SZbigniew Bodek * Redistribution and use in source and binary forms, with or without 63c0086b8SZbigniew Bodek * modification, are permitted provided that the following conditions 73c0086b8SZbigniew Bodek * are met: 83c0086b8SZbigniew Bodek * 1. Redistributions of source code must retain the above copyright 93c0086b8SZbigniew Bodek * notice, this list of conditions and the following disclaimer. 103c0086b8SZbigniew Bodek * 2. Redistributions in binary form must reproduce the above copyright 113c0086b8SZbigniew Bodek * notice, this list of conditions and the following disclaimer in the 123c0086b8SZbigniew Bodek * documentation and/or other materials provided with the distribution. 133c0086b8SZbigniew Bodek * 143c0086b8SZbigniew Bodek * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 153c0086b8SZbigniew Bodek * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 163c0086b8SZbigniew Bodek * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 173c0086b8SZbigniew Bodek * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 183c0086b8SZbigniew Bodek * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 193c0086b8SZbigniew Bodek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 203c0086b8SZbigniew Bodek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 213c0086b8SZbigniew Bodek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 223c0086b8SZbigniew Bodek * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 233c0086b8SZbigniew Bodek * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 243c0086b8SZbigniew Bodek * SUCH DAMAGE. 253c0086b8SZbigniew Bodek * 263c0086b8SZbigniew Bodek */ 273c0086b8SZbigniew Bodek 283c0086b8SZbigniew Bodek #ifndef NICVF_QUEUES_H 293c0086b8SZbigniew Bodek #define NICVF_QUEUES_H 303c0086b8SZbigniew Bodek 313c0086b8SZbigniew Bodek #include "q_struct.h" 323c0086b8SZbigniew Bodek 333c0086b8SZbigniew Bodek #define MAX_QUEUE_SET 128 343c0086b8SZbigniew Bodek #define MAX_RCV_QUEUES_PER_QS 8 353c0086b8SZbigniew Bodek #define MAX_RCV_BUF_DESC_RINGS_PER_QS 2 363c0086b8SZbigniew Bodek #define MAX_SND_QUEUES_PER_QS 8 373c0086b8SZbigniew Bodek #define MAX_CMP_QUEUES_PER_QS 8 383c0086b8SZbigniew Bodek 393c0086b8SZbigniew Bodek /* VF's queue interrupt ranges */ 403c0086b8SZbigniew Bodek #define NICVF_INTR_ID_CQ 0 413c0086b8SZbigniew Bodek #define NICVF_INTR_ID_SQ 8 423c0086b8SZbigniew Bodek #define NICVF_INTR_ID_RBDR 16 433c0086b8SZbigniew Bodek #define NICVF_INTR_ID_MISC 18 443c0086b8SZbigniew Bodek #define NICVF_INTR_ID_QS_ERR 19 453c0086b8SZbigniew Bodek 463c0086b8SZbigniew Bodek #define for_each_cq_irq(irq) \ 472306b72aSZbigniew Bodek for ((irq) = NICVF_INTR_ID_CQ; (irq) < NICVF_INTR_ID_SQ; (irq)++) 483c0086b8SZbigniew Bodek #define for_each_sq_irq(irq) \ 492306b72aSZbigniew Bodek for ((irq) = NICVF_INTR_ID_SQ; (irq) < NICVF_INTR_ID_RBDR; (irq)++) 503c0086b8SZbigniew Bodek #define for_each_rbdr_irq(irq) \ 512306b72aSZbigniew Bodek for ((irq) = NICVF_INTR_ID_RBDR; (irq) < NICVF_INTR_ID_MISC; (irq)++) 523c0086b8SZbigniew Bodek 532306b72aSZbigniew Bodek #define RBDR_SIZE0 0UL /* 8K entries */ 542306b72aSZbigniew Bodek #define RBDR_SIZE1 1UL /* 16K entries */ 552306b72aSZbigniew Bodek #define RBDR_SIZE2 2UL /* 32K entries */ 562306b72aSZbigniew Bodek #define RBDR_SIZE3 3UL /* 64K entries */ 572306b72aSZbigniew Bodek #define RBDR_SIZE4 4UL /* 126K entries */ 582306b72aSZbigniew Bodek #define RBDR_SIZE5 5UL /* 256K entries */ 592306b72aSZbigniew Bodek #define RBDR_SIZE6 6UL /* 512K entries */ 603c0086b8SZbigniew Bodek 612306b72aSZbigniew Bodek #define SND_QUEUE_SIZE0 0UL /* 1K entries */ 622306b72aSZbigniew Bodek #define SND_QUEUE_SIZE1 1UL /* 2K entries */ 632306b72aSZbigniew Bodek #define SND_QUEUE_SIZE2 2UL /* 4K entries */ 642306b72aSZbigniew Bodek #define SND_QUEUE_SIZE3 3UL /* 8K entries */ 652306b72aSZbigniew Bodek #define SND_QUEUE_SIZE4 4UL /* 16K entries */ 662306b72aSZbigniew Bodek #define SND_QUEUE_SIZE5 5UL /* 32K entries */ 672306b72aSZbigniew Bodek #define SND_QUEUE_SIZE6 6UL /* 64K entries */ 683c0086b8SZbigniew Bodek 692306b72aSZbigniew Bodek #define CMP_QUEUE_SIZE0 0UL /* 1K entries */ 702306b72aSZbigniew Bodek #define CMP_QUEUE_SIZE1 1UL /* 2K entries */ 712306b72aSZbigniew Bodek #define CMP_QUEUE_SIZE2 2UL /* 4K entries */ 722306b72aSZbigniew Bodek #define CMP_QUEUE_SIZE3 3UL /* 8K entries */ 732306b72aSZbigniew Bodek #define CMP_QUEUE_SIZE4 4UL /* 16K entries */ 742306b72aSZbigniew Bodek #define CMP_QUEUE_SIZE5 5UL /* 32K entries */ 752306b72aSZbigniew Bodek #define CMP_QUEUE_SIZE6 6UL /* 64K entries */ 763c0086b8SZbigniew Bodek 773c0086b8SZbigniew Bodek /* Default queue count per QS, its lengths and threshold values */ 783c0086b8SZbigniew Bodek #define RBDR_CNT 1 793c0086b8SZbigniew Bodek #define RCV_QUEUE_CNT 8 803c0086b8SZbigniew Bodek #define SND_QUEUE_CNT 8 813c0086b8SZbigniew Bodek #define CMP_QUEUE_CNT 8 /* Max of RCV and SND qcount */ 823c0086b8SZbigniew Bodek 833c0086b8SZbigniew Bodek #define SND_QSIZE SND_QUEUE_SIZE2 842306b72aSZbigniew Bodek #define SND_QUEUE_LEN (1UL << (SND_QSIZE + 10)) 852306b72aSZbigniew Bodek #define MAX_SND_QUEUE_LEN (1UL << (SND_QUEUE_SIZE6 + 10)) 862306b72aSZbigniew Bodek #define SND_QUEUE_THRESH 2UL 873c0086b8SZbigniew Bodek #define MIN_SQ_DESC_PER_PKT_XMIT 2 883c0086b8SZbigniew Bodek /* Since timestamp not enabled, otherwise 2 */ 893c0086b8SZbigniew Bodek #define MAX_CQE_PER_PKT_XMIT 1 903c0086b8SZbigniew Bodek 912306b72aSZbigniew Bodek /* 922306b72aSZbigniew Bodek * Keep CQ and SQ sizes same, if timestamping 933c0086b8SZbigniew Bodek * is enabled this equation will change. 943c0086b8SZbigniew Bodek */ 953c0086b8SZbigniew Bodek #define CMP_QSIZE CMP_QUEUE_SIZE2 962306b72aSZbigniew Bodek #define CMP_QUEUE_LEN (1UL << (CMP_QSIZE + 10)) 973bdcfeadSZbigniew Bodek #define CMP_QUEUE_CQE_THRESH 32 983c0086b8SZbigniew Bodek #define CMP_QUEUE_TIMER_THRESH 220 /* 10usec */ 993c0086b8SZbigniew Bodek 1003c0086b8SZbigniew Bodek #define RBDR_SIZE RBDR_SIZE0 1012306b72aSZbigniew Bodek #define RCV_BUF_COUNT (1UL << (RBDR_SIZE + 13)) 1022306b72aSZbigniew Bodek #define MAX_RCV_BUF_COUNT (1UL << (RBDR_SIZE6 + 13)) 1033c0086b8SZbigniew Bodek #define RBDR_THRESH (RCV_BUF_COUNT / 2) 1043c0086b8SZbigniew Bodek #define DMA_BUFFER_LEN 2048 /* In multiples of 128bytes */ 1053c0086b8SZbigniew Bodek 1062306b72aSZbigniew Bodek #define MAX_CQES_FOR_TX \ 1072306b72aSZbigniew Bodek ((SND_QUEUE_LEN / MIN_SQ_DESC_PER_PKT_XMIT) * MAX_CQE_PER_PKT_XMIT) 1083c0086b8SZbigniew Bodek /* Calculate number of CQEs to reserve for all SQEs. 1093c0086b8SZbigniew Bodek * Its 1/256th level of CQ size. 1103c0086b8SZbigniew Bodek * '+ 1' to account for pipelining 1113c0086b8SZbigniew Bodek */ 1122306b72aSZbigniew Bodek #define RQ_CQ_DROP \ 1132306b72aSZbigniew Bodek ((256 / (CMP_QUEUE_LEN / (CMP_QUEUE_LEN - MAX_CQES_FOR_TX))) + 1) 1143c0086b8SZbigniew Bodek 1153c0086b8SZbigniew Bodek /* Descriptor size in bytes */ 1163c0086b8SZbigniew Bodek #define SND_QUEUE_DESC_SIZE 16 1173c0086b8SZbigniew Bodek #define CMP_QUEUE_DESC_SIZE 512 1183c0086b8SZbigniew Bodek 1193c0086b8SZbigniew Bodek /* Buffer / descriptor alignments */ 1203c0086b8SZbigniew Bodek #define NICVF_RCV_BUF_ALIGN 7 1212306b72aSZbigniew Bodek #define NICVF_RCV_BUF_ALIGN_BYTES (1UL << NICVF_RCV_BUF_ALIGN) 1223c0086b8SZbigniew Bodek #define NICVF_CQ_BASE_ALIGN_BYTES 512 /* 9 bits */ 1233c0086b8SZbigniew Bodek #define NICVF_SQ_BASE_ALIGN_BYTES 128 /* 7 bits */ 1243c0086b8SZbigniew Bodek 1252306b72aSZbigniew Bodek #define NICVF_ALIGNED_ADDR(addr, align_bytes) \ 1262306b72aSZbigniew Bodek roundup2((addr), (align_bytes)) 1272306b72aSZbigniew Bodek #define NICVF_ADDR_ALIGN_LEN(addr, bytes) \ 1282306b72aSZbigniew Bodek (NICVF_ALIGNED_ADDR((addr), (bytes)) - (bytes)) 1292306b72aSZbigniew Bodek #define NICVF_RCV_BUF_ALIGN_LEN(addr) \ 1302306b72aSZbigniew Bodek (NICVF_ALIGNED_ADDR((addr), NICVF_RCV_BUF_ALIGN_BYTES) - (addr)) 1312306b72aSZbigniew Bodek 132af8fe8f1SZbigniew Bodek #define NICVF_TXBUF_MAXSIZE NIC_HW_MAX_FRS /* Total max payload without TSO */ 1332306b72aSZbigniew Bodek #define NICVF_TXBUF_NSEGS 256 /* Single command is at most 256 buffers 1342306b72aSZbigniew Bodek (hdr + 255 subcmds) */ 135af8fe8f1SZbigniew Bodek /* TSO-related definitions */ 136af8fe8f1SZbigniew Bodek #define NICVF_TSO_MAXSIZE IP_MAXPACKET 137af8fe8f1SZbigniew Bodek #define NICVF_TSO_NSEGS NICVF_TXBUF_NSEGS 138af8fe8f1SZbigniew Bodek #define NICVF_TSO_HEADER_SIZE 128 1393c0086b8SZbigniew Bodek 1403c0086b8SZbigniew Bodek /* Queue enable/disable */ 1412306b72aSZbigniew Bodek #define NICVF_SQ_EN (1UL << 19) 1423c0086b8SZbigniew Bodek 1433c0086b8SZbigniew Bodek /* Queue reset */ 1442306b72aSZbigniew Bodek #define NICVF_CQ_RESET (1UL << 41) 1452306b72aSZbigniew Bodek #define NICVF_SQ_RESET (1UL << 17) 1462306b72aSZbigniew Bodek #define NICVF_RBDR_RESET (1UL << 43) 1473c0086b8SZbigniew Bodek 1483c0086b8SZbigniew Bodek enum CQ_RX_ERRLVL_E { 1493c0086b8SZbigniew Bodek CQ_ERRLVL_MAC, 1503c0086b8SZbigniew Bodek CQ_ERRLVL_L2, 1513c0086b8SZbigniew Bodek CQ_ERRLVL_L3, 1523c0086b8SZbigniew Bodek CQ_ERRLVL_L4, 1533c0086b8SZbigniew Bodek }; 1543c0086b8SZbigniew Bodek 1553c0086b8SZbigniew Bodek enum CQ_RX_ERROP_E { 1563c0086b8SZbigniew Bodek CQ_RX_ERROP_RE_NONE = 0x0, 1573c0086b8SZbigniew Bodek CQ_RX_ERROP_RE_PARTIAL = 0x1, 1583c0086b8SZbigniew Bodek CQ_RX_ERROP_RE_JABBER = 0x2, 1593c0086b8SZbigniew Bodek CQ_RX_ERROP_RE_FCS = 0x7, 1603c0086b8SZbigniew Bodek CQ_RX_ERROP_RE_TERMINATE = 0x9, 1613c0086b8SZbigniew Bodek CQ_RX_ERROP_RE_RX_CTL = 0xb, 1623c0086b8SZbigniew Bodek CQ_RX_ERROP_PREL2_ERR = 0x1f, 1633c0086b8SZbigniew Bodek CQ_RX_ERROP_L2_FRAGMENT = 0x20, 1643c0086b8SZbigniew Bodek CQ_RX_ERROP_L2_OVERRUN = 0x21, 1653c0086b8SZbigniew Bodek CQ_RX_ERROP_L2_PFCS = 0x22, 1663c0086b8SZbigniew Bodek CQ_RX_ERROP_L2_PUNY = 0x23, 1673c0086b8SZbigniew Bodek CQ_RX_ERROP_L2_MAL = 0x24, 1683c0086b8SZbigniew Bodek CQ_RX_ERROP_L2_OVERSIZE = 0x25, 1693c0086b8SZbigniew Bodek CQ_RX_ERROP_L2_UNDERSIZE = 0x26, 1703c0086b8SZbigniew Bodek CQ_RX_ERROP_L2_LENMISM = 0x27, 1713c0086b8SZbigniew Bodek CQ_RX_ERROP_L2_PCLP = 0x28, 1723c0086b8SZbigniew Bodek CQ_RX_ERROP_IP_NOT = 0x41, 1733c0086b8SZbigniew Bodek CQ_RX_ERROP_IP_CSUM_ERR = 0x42, 1743c0086b8SZbigniew Bodek CQ_RX_ERROP_IP_MAL = 0x43, 1753c0086b8SZbigniew Bodek CQ_RX_ERROP_IP_MALD = 0x44, 1763c0086b8SZbigniew Bodek CQ_RX_ERROP_IP_HOP = 0x45, 1773c0086b8SZbigniew Bodek CQ_RX_ERROP_L3_ICRC = 0x46, 1783c0086b8SZbigniew Bodek CQ_RX_ERROP_L3_PCLP = 0x47, 1793c0086b8SZbigniew Bodek CQ_RX_ERROP_L4_MAL = 0x61, 1803c0086b8SZbigniew Bodek CQ_RX_ERROP_L4_CHK = 0x62, 1813c0086b8SZbigniew Bodek CQ_RX_ERROP_UDP_LEN = 0x63, 1823c0086b8SZbigniew Bodek CQ_RX_ERROP_L4_PORT = 0x64, 1833c0086b8SZbigniew Bodek CQ_RX_ERROP_TCP_FLAG = 0x65, 1843c0086b8SZbigniew Bodek CQ_RX_ERROP_TCP_OFFSET = 0x66, 1853c0086b8SZbigniew Bodek CQ_RX_ERROP_L4_PCLP = 0x67, 1863c0086b8SZbigniew Bodek CQ_RX_ERROP_RBDR_TRUNC = 0x70, 1873c0086b8SZbigniew Bodek }; 1883c0086b8SZbigniew Bodek 1893c0086b8SZbigniew Bodek enum CQ_TX_ERROP_E { 1903c0086b8SZbigniew Bodek CQ_TX_ERROP_GOOD = 0x0, 1913c0086b8SZbigniew Bodek CQ_TX_ERROP_DESC_FAULT = 0x10, 1923c0086b8SZbigniew Bodek CQ_TX_ERROP_HDR_CONS_ERR = 0x11, 1933c0086b8SZbigniew Bodek CQ_TX_ERROP_SUBDC_ERR = 0x12, 1943c0086b8SZbigniew Bodek CQ_TX_ERROP_IMM_SIZE_OFLOW = 0x80, 1953c0086b8SZbigniew Bodek CQ_TX_ERROP_DATA_SEQUENCE_ERR = 0x81, 1963c0086b8SZbigniew Bodek CQ_TX_ERROP_MEM_SEQUENCE_ERR = 0x82, 1973c0086b8SZbigniew Bodek CQ_TX_ERROP_LOCK_VIOL = 0x83, 1983c0086b8SZbigniew Bodek CQ_TX_ERROP_DATA_FAULT = 0x84, 1993c0086b8SZbigniew Bodek CQ_TX_ERROP_TSTMP_CONFLICT = 0x85, 2003c0086b8SZbigniew Bodek CQ_TX_ERROP_TSTMP_TIMEOUT = 0x86, 2013c0086b8SZbigniew Bodek CQ_TX_ERROP_MEM_FAULT = 0x87, 2023c0086b8SZbigniew Bodek CQ_TX_ERROP_CK_OVERLAP = 0x88, 2033c0086b8SZbigniew Bodek CQ_TX_ERROP_CK_OFLOW = 0x89, 2043c0086b8SZbigniew Bodek CQ_TX_ERROP_ENUM_LAST = 0x8a, 2053c0086b8SZbigniew Bodek }; 2063c0086b8SZbigniew Bodek 2073c0086b8SZbigniew Bodek struct cmp_queue_stats { 2083c0086b8SZbigniew Bodek struct tx_stats { 2092306b72aSZbigniew Bodek uint64_t good; 2102306b72aSZbigniew Bodek uint64_t desc_fault; 2112306b72aSZbigniew Bodek uint64_t hdr_cons_err; 2122306b72aSZbigniew Bodek uint64_t subdesc_err; 2132306b72aSZbigniew Bodek uint64_t imm_size_oflow; 2142306b72aSZbigniew Bodek uint64_t data_seq_err; 2152306b72aSZbigniew Bodek uint64_t mem_seq_err; 2162306b72aSZbigniew Bodek uint64_t lock_viol; 2172306b72aSZbigniew Bodek uint64_t data_fault; 2182306b72aSZbigniew Bodek uint64_t tstmp_conflict; 2192306b72aSZbigniew Bodek uint64_t tstmp_timeout; 2202306b72aSZbigniew Bodek uint64_t mem_fault; 2212306b72aSZbigniew Bodek uint64_t csum_overlap; 2222306b72aSZbigniew Bodek uint64_t csum_overflow; 2233c0086b8SZbigniew Bodek } tx; 2242306b72aSZbigniew Bodek } __aligned(CACHE_LINE_SIZE); 2253c0086b8SZbigniew Bodek 2263c0086b8SZbigniew Bodek enum RQ_SQ_STATS { 2273c0086b8SZbigniew Bodek RQ_SQ_STATS_OCTS, 2283c0086b8SZbigniew Bodek RQ_SQ_STATS_PKTS, 2293c0086b8SZbigniew Bodek }; 2303c0086b8SZbigniew Bodek 2313c0086b8SZbigniew Bodek struct rx_tx_queue_stats { 2322306b72aSZbigniew Bodek uint64_t bytes; 2332306b72aSZbigniew Bodek uint64_t pkts; 2342306b72aSZbigniew Bodek } __aligned(CACHE_LINE_SIZE); 2353c0086b8SZbigniew Bodek 2363c0086b8SZbigniew Bodek struct q_desc_mem { 2372306b72aSZbigniew Bodek bus_dma_tag_t dmat; 2382306b72aSZbigniew Bodek bus_dmamap_t dmap; 2393c0086b8SZbigniew Bodek void *base; 2402306b72aSZbigniew Bodek bus_addr_t phys_base; 2412306b72aSZbigniew Bodek uint64_t size; 2422306b72aSZbigniew Bodek uint16_t q_len; 2433c0086b8SZbigniew Bodek }; 2443c0086b8SZbigniew Bodek 2453c0086b8SZbigniew Bodek struct rbdr { 2462306b72aSZbigniew Bodek boolean_t enable; 2472306b72aSZbigniew Bodek uint32_t dma_size; 2482306b72aSZbigniew Bodek uint32_t frag_len; 2492306b72aSZbigniew Bodek uint32_t thresh; /* Threshold level for interrupt */ 2503c0086b8SZbigniew Bodek void *desc; 2512306b72aSZbigniew Bodek uint32_t head; 2522306b72aSZbigniew Bodek uint32_t tail; 2533c0086b8SZbigniew Bodek struct q_desc_mem dmem; 2542306b72aSZbigniew Bodek 2552306b72aSZbigniew Bodek struct nicvf *nic; 2562306b72aSZbigniew Bodek int idx; 2572306b72aSZbigniew Bodek 2582306b72aSZbigniew Bodek struct task rbdr_task; 2592306b72aSZbigniew Bodek struct task rbdr_task_nowait; 2602306b72aSZbigniew Bodek struct taskqueue *rbdr_taskq; 2612306b72aSZbigniew Bodek 2622306b72aSZbigniew Bodek bus_dma_tag_t rbdr_buff_dmat; 2632306b72aSZbigniew Bodek bus_dmamap_t *rbdr_buff_dmaps; 2642306b72aSZbigniew Bodek } __aligned(CACHE_LINE_SIZE); 2653c0086b8SZbigniew Bodek 2663c0086b8SZbigniew Bodek struct rcv_queue { 2672306b72aSZbigniew Bodek boolean_t enable; 2683c0086b8SZbigniew Bodek struct rbdr *rbdr_start; 2693c0086b8SZbigniew Bodek struct rbdr *rbdr_cont; 2702306b72aSZbigniew Bodek boolean_t en_tcp_reassembly; 2712306b72aSZbigniew Bodek uint8_t cq_qs; /* CQ's QS to which this RQ is assigned */ 2722306b72aSZbigniew Bodek uint8_t cq_idx; /* CQ index (0 to 7) in the QS */ 2732306b72aSZbigniew Bodek uint8_t cont_rbdr_qs; /* Continue buffer ptrs - QS num */ 2742306b72aSZbigniew Bodek uint8_t cont_qs_rbdr_idx; /* RBDR idx in the cont QS */ 2752306b72aSZbigniew Bodek uint8_t start_rbdr_qs; /* First buffer ptrs - QS num */ 2762306b72aSZbigniew Bodek uint8_t start_qs_rbdr_idx; /* RBDR idx in the above QS */ 2772306b72aSZbigniew Bodek uint8_t caching; 2783c0086b8SZbigniew Bodek struct rx_tx_queue_stats stats; 279053f3d0eSZbigniew Bodek 280053f3d0eSZbigniew Bodek boolean_t lro_enabled; 281053f3d0eSZbigniew Bodek struct lro_ctrl lro; 2822306b72aSZbigniew Bodek } __aligned(CACHE_LINE_SIZE); 2833c0086b8SZbigniew Bodek 2843c0086b8SZbigniew Bodek struct cmp_queue { 2852306b72aSZbigniew Bodek boolean_t enable; 2862306b72aSZbigniew Bodek uint16_t thresh; 2872306b72aSZbigniew Bodek 2882306b72aSZbigniew Bodek struct nicvf *nic; 2892306b72aSZbigniew Bodek int idx; /* This queue index */ 2902306b72aSZbigniew Bodek 2912306b72aSZbigniew Bodek struct buf_ring *rx_br; /* Reception buf ring */ 2922306b72aSZbigniew Bodek struct mtx mtx; /* lock to serialize processing CQEs */ 2932306b72aSZbigniew Bodek char mtx_name[32]; 2942306b72aSZbigniew Bodek 2952306b72aSZbigniew Bodek struct task cmp_task; 2962306b72aSZbigniew Bodek struct taskqueue *cmp_taskq; 297*ec6f8f42SZbigniew Bodek u_int cmp_cpuid; /* CPU to which bind the CQ task */ 2982306b72aSZbigniew Bodek 2993c0086b8SZbigniew Bodek void *desc; 3003c0086b8SZbigniew Bodek struct q_desc_mem dmem; 3013c0086b8SZbigniew Bodek struct cmp_queue_stats stats; 3023c0086b8SZbigniew Bodek int irq; 3032306b72aSZbigniew Bodek } __aligned(CACHE_LINE_SIZE); 3042306b72aSZbigniew Bodek 3052306b72aSZbigniew Bodek struct snd_buff { 3062306b72aSZbigniew Bodek bus_dmamap_t dmap; 3072306b72aSZbigniew Bodek struct mbuf *mbuf; 3082306b72aSZbigniew Bodek }; 3093c0086b8SZbigniew Bodek 3103c0086b8SZbigniew Bodek struct snd_queue { 3112306b72aSZbigniew Bodek boolean_t enable; 3122306b72aSZbigniew Bodek uint8_t cq_qs; /* CQ's QS to which this SQ is pointing */ 3132306b72aSZbigniew Bodek uint8_t cq_idx; /* CQ index (0 to 7) in the above QS */ 3142306b72aSZbigniew Bodek uint16_t thresh; 3152306b72aSZbigniew Bodek volatile int free_cnt; 3162306b72aSZbigniew Bodek uint32_t head; 3172306b72aSZbigniew Bodek uint32_t tail; 3182306b72aSZbigniew Bodek uint64_t *skbuff; 3193c0086b8SZbigniew Bodek void *desc; 3203c0086b8SZbigniew Bodek 3212306b72aSZbigniew Bodek struct nicvf *nic; 3222306b72aSZbigniew Bodek int idx; /* This queue index */ 3232306b72aSZbigniew Bodek 3242306b72aSZbigniew Bodek bus_dma_tag_t snd_buff_dmat; 3252306b72aSZbigniew Bodek struct snd_buff *snd_buff; 3262306b72aSZbigniew Bodek 3272306b72aSZbigniew Bodek struct buf_ring *br; /* Transmission buf ring */ 3282306b72aSZbigniew Bodek struct mtx mtx; 3292306b72aSZbigniew Bodek char mtx_name[32]; 3302306b72aSZbigniew Bodek 3312306b72aSZbigniew Bodek struct task snd_task; 3322306b72aSZbigniew Bodek struct taskqueue *snd_taskq; 3332306b72aSZbigniew Bodek 3343c0086b8SZbigniew Bodek struct q_desc_mem dmem; 3353c0086b8SZbigniew Bodek struct rx_tx_queue_stats stats; 3362306b72aSZbigniew Bodek } __aligned(CACHE_LINE_SIZE); 3373c0086b8SZbigniew Bodek 3383c0086b8SZbigniew Bodek struct queue_set { 3392306b72aSZbigniew Bodek boolean_t enable; 3402306b72aSZbigniew Bodek boolean_t be_en; 3412306b72aSZbigniew Bodek uint8_t vnic_id; 3422306b72aSZbigniew Bodek uint8_t rq_cnt; 3432306b72aSZbigniew Bodek uint8_t cq_cnt; 3442306b72aSZbigniew Bodek uint64_t cq_len; 3452306b72aSZbigniew Bodek uint8_t sq_cnt; 3462306b72aSZbigniew Bodek uint64_t sq_len; 3472306b72aSZbigniew Bodek uint8_t rbdr_cnt; 3482306b72aSZbigniew Bodek uint64_t rbdr_len; 3493c0086b8SZbigniew Bodek struct rcv_queue rq[MAX_RCV_QUEUES_PER_QS]; 3503c0086b8SZbigniew Bodek struct cmp_queue cq[MAX_CMP_QUEUES_PER_QS]; 3513c0086b8SZbigniew Bodek struct snd_queue sq[MAX_SND_QUEUES_PER_QS]; 3523c0086b8SZbigniew Bodek struct rbdr rbdr[MAX_RCV_BUF_DESC_RINGS_PER_QS]; 3532306b72aSZbigniew Bodek 3542306b72aSZbigniew Bodek struct task qs_err_task; 3552306b72aSZbigniew Bodek struct taskqueue *qs_err_taskq; 3562306b72aSZbigniew Bodek } __aligned(CACHE_LINE_SIZE); 3573c0086b8SZbigniew Bodek 3583c0086b8SZbigniew Bodek #define GET_RBDR_DESC(RING, idx) \ 3592306b72aSZbigniew Bodek (&(((struct rbdr_entry_t *)((RING)->desc))[(idx)])) 3603c0086b8SZbigniew Bodek #define GET_SQ_DESC(RING, idx) \ 3612306b72aSZbigniew Bodek (&(((struct sq_hdr_subdesc *)((RING)->desc))[(idx)])) 3623c0086b8SZbigniew Bodek #define GET_CQ_DESC(RING, idx) \ 3632306b72aSZbigniew Bodek (&(((union cq_desc_t *)((RING)->desc))[(idx)])) 3643c0086b8SZbigniew Bodek 3653c0086b8SZbigniew Bodek /* CQ status bits */ 3662306b72aSZbigniew Bodek #define CQ_WR_FUL (1UL << 26) 3672306b72aSZbigniew Bodek #define CQ_WR_DISABLE (1UL << 25) 3682306b72aSZbigniew Bodek #define CQ_WR_FAULT (1UL << 24) 3693c0086b8SZbigniew Bodek #define CQ_CQE_COUNT (0xFFFF << 0) 3703c0086b8SZbigniew Bodek 3712306b72aSZbigniew Bodek #define CQ_ERR_MASK (CQ_WR_FUL | CQ_WR_DISABLE | CQ_WR_FAULT) 3723c0086b8SZbigniew Bodek 3732306b72aSZbigniew Bodek #define NICVF_TX_LOCK(sq) mtx_lock(&(sq)->mtx) 3742306b72aSZbigniew Bodek #define NICVF_TX_TRYLOCK(sq) mtx_trylock(&(sq)->mtx) 3752306b72aSZbigniew Bodek #define NICVF_TX_UNLOCK(sq) mtx_unlock(&(sq)->mtx) 3762306b72aSZbigniew Bodek #define NICVF_TX_LOCK_ASSERT(sq) mtx_assert(&(sq)->mtx, MA_OWNED) 3773c0086b8SZbigniew Bodek 3782306b72aSZbigniew Bodek #define NICVF_CMP_LOCK(cq) mtx_lock(&(cq)->mtx) 3792306b72aSZbigniew Bodek #define NICVF_CMP_UNLOCK(cq) mtx_unlock(&(cq)->mtx) 3803c0086b8SZbigniew Bodek 3812306b72aSZbigniew Bodek int nicvf_set_qset_resources(struct nicvf *); 3822306b72aSZbigniew Bodek int nicvf_config_data_transfer(struct nicvf *, boolean_t); 3832306b72aSZbigniew Bodek void nicvf_qset_config(struct nicvf *, boolean_t); 3843c0086b8SZbigniew Bodek 3852306b72aSZbigniew Bodek void nicvf_enable_intr(struct nicvf *, int, int); 3862306b72aSZbigniew Bodek void nicvf_disable_intr(struct nicvf *, int, int); 3872306b72aSZbigniew Bodek void nicvf_clear_intr(struct nicvf *, int, int); 3882306b72aSZbigniew Bodek int nicvf_is_intr_enabled(struct nicvf *, int, int); 3893c0086b8SZbigniew Bodek 3907c617aceSZbigniew Bodek int nicvf_xmit_locked(struct snd_queue *sq); 391332c8697SZbigniew Bodek 3923c0086b8SZbigniew Bodek /* Register access APIs */ 3932306b72aSZbigniew Bodek void nicvf_reg_write(struct nicvf *, uint64_t, uint64_t); 3942306b72aSZbigniew Bodek uint64_t nicvf_reg_read(struct nicvf *, uint64_t); 3952306b72aSZbigniew Bodek void nicvf_qset_reg_write(struct nicvf *, uint64_t, uint64_t); 3962306b72aSZbigniew Bodek uint64_t nicvf_qset_reg_read(struct nicvf *, uint64_t); 3972306b72aSZbigniew Bodek void nicvf_queue_reg_write(struct nicvf *, uint64_t, uint64_t, uint64_t); 3982306b72aSZbigniew Bodek uint64_t nicvf_queue_reg_read(struct nicvf *, uint64_t, uint64_t); 3993c0086b8SZbigniew Bodek 4003c0086b8SZbigniew Bodek /* Stats */ 4012306b72aSZbigniew Bodek void nicvf_update_rq_stats(struct nicvf *, int); 4022306b72aSZbigniew Bodek void nicvf_update_sq_stats(struct nicvf *, int); 4032306b72aSZbigniew Bodek int nicvf_check_cqe_rx_errs(struct nicvf *, struct cmp_queue *, 4042306b72aSZbigniew Bodek struct cqe_rx_t *); 4052306b72aSZbigniew Bodek int nicvf_check_cqe_tx_errs(struct nicvf *,struct cmp_queue *, 4062306b72aSZbigniew Bodek struct cqe_send_t *); 4073c0086b8SZbigniew Bodek #endif /* NICVF_QUEUES_H */ 408