1*56b2bdd1SGireesh Nagabhushana /* 2*56b2bdd1SGireesh Nagabhushana * This file and its contents are supplied under the terms of the 3*56b2bdd1SGireesh Nagabhushana * Common Development and Distribution License ("CDDL"), version 1.0. 4*56b2bdd1SGireesh Nagabhushana * You may only use this file in accordance with the terms of version 5*56b2bdd1SGireesh Nagabhushana * 1.0 of the CDDL. 6*56b2bdd1SGireesh Nagabhushana * 7*56b2bdd1SGireesh Nagabhushana * A full copy of the text of the CDDL should have accompanied this 8*56b2bdd1SGireesh Nagabhushana * source. A copy of the CDDL is also available via the Internet at 9*56b2bdd1SGireesh Nagabhushana * http://www.illumos.org/license/CDDL. 10*56b2bdd1SGireesh Nagabhushana */ 11*56b2bdd1SGireesh Nagabhushana 12*56b2bdd1SGireesh Nagabhushana /* 13*56b2bdd1SGireesh Nagabhushana * This file is part of the Chelsio T4 support code. 14*56b2bdd1SGireesh Nagabhushana * 15*56b2bdd1SGireesh Nagabhushana * Copyright (C) 2011-2013 Chelsio Communications. All rights reserved. 16*56b2bdd1SGireesh Nagabhushana * 17*56b2bdd1SGireesh Nagabhushana * This program is distributed in the hope that it will be useful, but WITHOUT 18*56b2bdd1SGireesh Nagabhushana * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 19*56b2bdd1SGireesh Nagabhushana * FITNESS FOR A PARTICULAR PURPOSE. See the LICENSE file included in this 20*56b2bdd1SGireesh Nagabhushana * release for licensing terms and conditions. 21*56b2bdd1SGireesh Nagabhushana */ 22*56b2bdd1SGireesh Nagabhushana 23*56b2bdd1SGireesh Nagabhushana #ifndef __CXGBE_ADAPTER_H 24*56b2bdd1SGireesh Nagabhushana #define __CXGBE_ADAPTER_H 25*56b2bdd1SGireesh Nagabhushana 26*56b2bdd1SGireesh Nagabhushana #include <sys/ddi.h> 27*56b2bdd1SGireesh Nagabhushana #include <sys/mac_provider.h> 28*56b2bdd1SGireesh Nagabhushana #include <sys/ethernet.h> 29*56b2bdd1SGireesh Nagabhushana #include <sys/queue.h> 30*56b2bdd1SGireesh Nagabhushana 31*56b2bdd1SGireesh Nagabhushana #include "offload.h" 32*56b2bdd1SGireesh Nagabhushana #include "firmware/t4fw_interface.h" 33*56b2bdd1SGireesh Nagabhushana 34*56b2bdd1SGireesh Nagabhushana struct adapter; 35*56b2bdd1SGireesh Nagabhushana typedef struct adapter adapter_t; 36*56b2bdd1SGireesh Nagabhushana 37*56b2bdd1SGireesh Nagabhushana enum { 38*56b2bdd1SGireesh Nagabhushana FW_IQ_QSIZE = 256, 39*56b2bdd1SGireesh Nagabhushana FW_IQ_ESIZE = 64, /* At least 64 mandated by the firmware spec */ 40*56b2bdd1SGireesh Nagabhushana 41*56b2bdd1SGireesh Nagabhushana RX_IQ_QSIZE = 1024, 42*56b2bdd1SGireesh Nagabhushana RX_IQ_ESIZE = 64, /* At least 64 so CPL_RX_PKT will fit */ 43*56b2bdd1SGireesh Nagabhushana 44*56b2bdd1SGireesh Nagabhushana EQ_ESIZE = 64, /* All egres queues use this entry size */ 45*56b2bdd1SGireesh Nagabhushana 46*56b2bdd1SGireesh Nagabhushana RX_FL_ESIZE = 64, /* 8 64bit addresses */ 47*56b2bdd1SGireesh Nagabhushana 48*56b2bdd1SGireesh Nagabhushana FL_BUF_SIZES = 4, 49*56b2bdd1SGireesh Nagabhushana 50*56b2bdd1SGireesh Nagabhushana CTRL_EQ_QSIZE = 128, 51*56b2bdd1SGireesh Nagabhushana 52*56b2bdd1SGireesh Nagabhushana TX_EQ_QSIZE = 1024, 53*56b2bdd1SGireesh Nagabhushana TX_SGL_SEGS = 36, 54*56b2bdd1SGireesh Nagabhushana TX_WR_FLITS = SGE_MAX_WR_LEN / 8 55*56b2bdd1SGireesh Nagabhushana }; 56*56b2bdd1SGireesh Nagabhushana 57*56b2bdd1SGireesh Nagabhushana enum { 58*56b2bdd1SGireesh Nagabhushana /* adapter flags */ 59*56b2bdd1SGireesh Nagabhushana FULL_INIT_DONE = (1 << 0), 60*56b2bdd1SGireesh Nagabhushana FW_OK = (1 << 1), 61*56b2bdd1SGireesh Nagabhushana INTR_FWD = (1 << 2), 62*56b2bdd1SGireesh Nagabhushana INTR_ALLOCATED = (1 << 3), 63*56b2bdd1SGireesh Nagabhushana MASTER_PF = (1 << 4), 64*56b2bdd1SGireesh Nagabhushana 65*56b2bdd1SGireesh Nagabhushana CXGBE_BUSY = (1 << 9), 66*56b2bdd1SGireesh Nagabhushana 67*56b2bdd1SGireesh Nagabhushana /* port flags */ 68*56b2bdd1SGireesh Nagabhushana DOOMED = (1 << 0), 69*56b2bdd1SGireesh Nagabhushana PORT_INIT_DONE = (1 << 1), 70*56b2bdd1SGireesh Nagabhushana }; 71*56b2bdd1SGireesh Nagabhushana 72*56b2bdd1SGireesh Nagabhushana enum { 73*56b2bdd1SGireesh Nagabhushana /* Features */ 74*56b2bdd1SGireesh Nagabhushana CXGBE_HW_LSO = (1 << 0), 75*56b2bdd1SGireesh Nagabhushana CXGBE_HW_CSUM = (1 << 1), 76*56b2bdd1SGireesh Nagabhushana }; 77*56b2bdd1SGireesh Nagabhushana 78*56b2bdd1SGireesh Nagabhushana #define IS_DOOMED(pi) (pi->flags & DOOMED) 79*56b2bdd1SGireesh Nagabhushana #define SET_DOOMED(pi) do { pi->flags |= DOOMED; } while (0) 80*56b2bdd1SGireesh Nagabhushana #define IS_BUSY(sc) (sc->flags & CXGBE_BUSY) 81*56b2bdd1SGireesh Nagabhushana #define SET_BUSY(sc) do { sc->flags |= CXGBE_BUSY; } while (0) 82*56b2bdd1SGireesh Nagabhushana #define CLR_BUSY(sc) do { sc->flags &= ~CXGBE_BUSY; } while (0) 83*56b2bdd1SGireesh Nagabhushana 84*56b2bdd1SGireesh Nagabhushana struct port_info { 85*56b2bdd1SGireesh Nagabhushana PORT_INFO_HDR; 86*56b2bdd1SGireesh Nagabhushana 87*56b2bdd1SGireesh Nagabhushana kmutex_t lock; 88*56b2bdd1SGireesh Nagabhushana struct adapter *adapter; 89*56b2bdd1SGireesh Nagabhushana 90*56b2bdd1SGireesh Nagabhushana #ifndef TCP_OFFLOAD_DISABLE 91*56b2bdd1SGireesh Nagabhushana void *tdev; 92*56b2bdd1SGireesh Nagabhushana #endif 93*56b2bdd1SGireesh Nagabhushana 94*56b2bdd1SGireesh Nagabhushana unsigned int flags; 95*56b2bdd1SGireesh Nagabhushana 96*56b2bdd1SGireesh Nagabhushana uint16_t viid; 97*56b2bdd1SGireesh Nagabhushana int16_t xact_addr_filt; /* index of exact MAC address filter */ 98*56b2bdd1SGireesh Nagabhushana uint16_t rss_size; /* size of VI's RSS table slice */ 99*56b2bdd1SGireesh Nagabhushana uint16_t ntxq; /* # of tx queues */ 100*56b2bdd1SGireesh Nagabhushana uint16_t first_txq; /* index of first tx queue */ 101*56b2bdd1SGireesh Nagabhushana uint16_t nrxq; /* # of rx queues */ 102*56b2bdd1SGireesh Nagabhushana uint16_t first_rxq; /* index of first rx queue */ 103*56b2bdd1SGireesh Nagabhushana #ifndef TCP_OFFLOAD_DISABLE 104*56b2bdd1SGireesh Nagabhushana uint16_t nofldtxq; /* # of offload tx queues */ 105*56b2bdd1SGireesh Nagabhushana uint16_t first_ofld_txq; /* index of first offload tx queue */ 106*56b2bdd1SGireesh Nagabhushana uint16_t nofldrxq; /* # of offload rx queues */ 107*56b2bdd1SGireesh Nagabhushana uint16_t first_ofld_rxq; /* index of first offload rx queue */ 108*56b2bdd1SGireesh Nagabhushana #endif 109*56b2bdd1SGireesh Nagabhushana uint8_t lport; /* associated offload logical port */ 110*56b2bdd1SGireesh Nagabhushana int8_t mdio_addr; 111*56b2bdd1SGireesh Nagabhushana uint8_t port_type; 112*56b2bdd1SGireesh Nagabhushana uint8_t mod_type; 113*56b2bdd1SGireesh Nagabhushana uint8_t port_id; 114*56b2bdd1SGireesh Nagabhushana uint8_t tx_chan; 115*56b2bdd1SGireesh Nagabhushana uint8_t instance; /* Associated adapter instance */ 116*56b2bdd1SGireesh Nagabhushana uint8_t child_inst; /* Associated child instance */ 117*56b2bdd1SGireesh Nagabhushana uint8_t tmr_idx; 118*56b2bdd1SGireesh Nagabhushana int8_t pktc_idx; 119*56b2bdd1SGireesh Nagabhushana struct link_config link_cfg; 120*56b2bdd1SGireesh Nagabhushana struct port_stats stats; 121*56b2bdd1SGireesh Nagabhushana uint32_t features; 122*56b2bdd1SGireesh Nagabhushana kstat_t *ksp_config; 123*56b2bdd1SGireesh Nagabhushana kstat_t *ksp_info; 124*56b2bdd1SGireesh Nagabhushana }; 125*56b2bdd1SGireesh Nagabhushana 126*56b2bdd1SGireesh Nagabhushana struct fl_sdesc { 127*56b2bdd1SGireesh Nagabhushana struct rxbuf *rxb; 128*56b2bdd1SGireesh Nagabhushana }; 129*56b2bdd1SGireesh Nagabhushana 130*56b2bdd1SGireesh Nagabhushana struct tx_desc { 131*56b2bdd1SGireesh Nagabhushana __be64 flit[8]; 132*56b2bdd1SGireesh Nagabhushana }; 133*56b2bdd1SGireesh Nagabhushana 134*56b2bdd1SGireesh Nagabhushana /* DMA maps used for tx */ 135*56b2bdd1SGireesh Nagabhushana struct tx_maps { 136*56b2bdd1SGireesh Nagabhushana ddi_dma_handle_t *map; 137*56b2bdd1SGireesh Nagabhushana uint32_t map_total; /* # of DMA maps */ 138*56b2bdd1SGireesh Nagabhushana uint32_t map_pidx; /* next map to be used */ 139*56b2bdd1SGireesh Nagabhushana uint32_t map_cidx; /* reclaimed up to this index */ 140*56b2bdd1SGireesh Nagabhushana uint32_t map_avail; /* # of available maps */ 141*56b2bdd1SGireesh Nagabhushana }; 142*56b2bdd1SGireesh Nagabhushana 143*56b2bdd1SGireesh Nagabhushana struct tx_sdesc { 144*56b2bdd1SGireesh Nagabhushana mblk_t *m; 145*56b2bdd1SGireesh Nagabhushana uint32_t txb_used; /* # of bytes of tx copy buffer used */ 146*56b2bdd1SGireesh Nagabhushana uint16_t hdls_used; /* # of dma handles used */ 147*56b2bdd1SGireesh Nagabhushana uint16_t desc_used; /* # of hardware descriptors used */ 148*56b2bdd1SGireesh Nagabhushana }; 149*56b2bdd1SGireesh Nagabhushana 150*56b2bdd1SGireesh Nagabhushana enum { 151*56b2bdd1SGireesh Nagabhushana /* iq flags */ 152*56b2bdd1SGireesh Nagabhushana IQ_ALLOCATED = (1 << 0), /* firmware resources allocated */ 153*56b2bdd1SGireesh Nagabhushana IQ_INTR = (1 << 1), /* iq takes direct interrupt */ 154*56b2bdd1SGireesh Nagabhushana IQ_HAS_FL = (1 << 2), /* iq has fl */ 155*56b2bdd1SGireesh Nagabhushana 156*56b2bdd1SGireesh Nagabhushana /* iq state */ 157*56b2bdd1SGireesh Nagabhushana IQS_DISABLED = 0, 158*56b2bdd1SGireesh Nagabhushana IQS_BUSY = 1, 159*56b2bdd1SGireesh Nagabhushana IQS_IDLE = 2, 160*56b2bdd1SGireesh Nagabhushana }; 161*56b2bdd1SGireesh Nagabhushana 162*56b2bdd1SGireesh Nagabhushana /* 163*56b2bdd1SGireesh Nagabhushana * Ingress Queue: T4 is producer, driver is consumer. 164*56b2bdd1SGireesh Nagabhushana */ 165*56b2bdd1SGireesh Nagabhushana struct sge_iq { 166*56b2bdd1SGireesh Nagabhushana unsigned int flags; 167*56b2bdd1SGireesh Nagabhushana ddi_dma_handle_t dhdl; 168*56b2bdd1SGireesh Nagabhushana ddi_acc_handle_t ahdl; 169*56b2bdd1SGireesh Nagabhushana 170*56b2bdd1SGireesh Nagabhushana volatile uint_t state; 171*56b2bdd1SGireesh Nagabhushana __be64 *desc; /* KVA of descriptor ring */ 172*56b2bdd1SGireesh Nagabhushana uint64_t ba; /* bus address of descriptor ring */ 173*56b2bdd1SGireesh Nagabhushana const __be64 *cdesc; /* current descriptor */ 174*56b2bdd1SGireesh Nagabhushana struct adapter *adapter; /* associated adapter */ 175*56b2bdd1SGireesh Nagabhushana uint8_t gen; /* generation bit */ 176*56b2bdd1SGireesh Nagabhushana uint8_t intr_params; /* interrupt holdoff parameters */ 177*56b2bdd1SGireesh Nagabhushana int8_t intr_pktc_idx; /* packet count threshold index */ 178*56b2bdd1SGireesh Nagabhushana uint8_t intr_next; /* holdoff for next interrupt */ 179*56b2bdd1SGireesh Nagabhushana uint8_t esize; /* size (bytes) of each entry in the queue */ 180*56b2bdd1SGireesh Nagabhushana uint16_t qsize; /* size (# of entries) of the queue */ 181*56b2bdd1SGireesh Nagabhushana uint16_t cidx; /* consumer index */ 182*56b2bdd1SGireesh Nagabhushana uint16_t pending; /* # of descs processed since last doorbell */ 183*56b2bdd1SGireesh Nagabhushana uint16_t cntxt_id; /* SGE context id for the iq */ 184*56b2bdd1SGireesh Nagabhushana uint16_t abs_id; /* absolute SGE id for the iq */ 185*56b2bdd1SGireesh Nagabhushana 186*56b2bdd1SGireesh Nagabhushana STAILQ_ENTRY(sge_iq) link; 187*56b2bdd1SGireesh Nagabhushana }; 188*56b2bdd1SGireesh Nagabhushana 189*56b2bdd1SGireesh Nagabhushana enum { 190*56b2bdd1SGireesh Nagabhushana EQ_CTRL = 1, 191*56b2bdd1SGireesh Nagabhushana EQ_ETH = 2, 192*56b2bdd1SGireesh Nagabhushana #ifndef TCP_OFFLOAD_DISABLE 193*56b2bdd1SGireesh Nagabhushana EQ_OFLD = 3, 194*56b2bdd1SGireesh Nagabhushana #endif 195*56b2bdd1SGireesh Nagabhushana 196*56b2bdd1SGireesh Nagabhushana /* eq flags */ 197*56b2bdd1SGireesh Nagabhushana EQ_TYPEMASK = 7, /* 3 lsbits hold the type */ 198*56b2bdd1SGireesh Nagabhushana EQ_ALLOCATED = (1 << 3), /* firmware resources allocated */ 199*56b2bdd1SGireesh Nagabhushana EQ_DOOMED = (1 << 4), /* about to be destroyed */ 200*56b2bdd1SGireesh Nagabhushana EQ_CRFLUSHED = (1 << 5), /* expecting an update from SGE */ 201*56b2bdd1SGireesh Nagabhushana EQ_STALLED = (1 << 6), /* out of hw descriptors or dmamaps */ 202*56b2bdd1SGireesh Nagabhushana EQ_MTX = (1 << 7), /* mutex has been initialized */ 203*56b2bdd1SGireesh Nagabhushana EQ_STARTED = (1 << 8), /* started */ 204*56b2bdd1SGireesh Nagabhushana }; 205*56b2bdd1SGireesh Nagabhushana 206*56b2bdd1SGireesh Nagabhushana /* 207*56b2bdd1SGireesh Nagabhushana * Egress Queue: driver is producer, T4 is consumer. 208*56b2bdd1SGireesh Nagabhushana * 209*56b2bdd1SGireesh Nagabhushana * Note: A free list is an egress queue (driver produces the buffers and T4 210*56b2bdd1SGireesh Nagabhushana * consumes them) but it's special enough to have its own struct (see sge_fl). 211*56b2bdd1SGireesh Nagabhushana */ 212*56b2bdd1SGireesh Nagabhushana struct sge_eq { 213*56b2bdd1SGireesh Nagabhushana ddi_dma_handle_t desc_dhdl; 214*56b2bdd1SGireesh Nagabhushana ddi_acc_handle_t desc_ahdl; 215*56b2bdd1SGireesh Nagabhushana unsigned int flags; 216*56b2bdd1SGireesh Nagabhushana kmutex_t lock; 217*56b2bdd1SGireesh Nagabhushana 218*56b2bdd1SGireesh Nagabhushana struct tx_desc *desc; /* KVA of descriptor ring */ 219*56b2bdd1SGireesh Nagabhushana uint64_t ba; /* bus address of descriptor ring */ 220*56b2bdd1SGireesh Nagabhushana struct sge_qstat *spg; /* status page, for convenience */ 221*56b2bdd1SGireesh Nagabhushana uint16_t cap; /* max # of desc, for convenience */ 222*56b2bdd1SGireesh Nagabhushana uint16_t avail; /* available descriptors, for convenience */ 223*56b2bdd1SGireesh Nagabhushana uint16_t qsize; /* size (# of entries) of the queue */ 224*56b2bdd1SGireesh Nagabhushana uint16_t cidx; /* consumer idx (desc idx) */ 225*56b2bdd1SGireesh Nagabhushana uint16_t pidx; /* producer idx (desc idx) */ 226*56b2bdd1SGireesh Nagabhushana uint16_t pending; /* # of descriptors used since last doorbell */ 227*56b2bdd1SGireesh Nagabhushana uint16_t iqid; /* iq that gets egr_update for the eq */ 228*56b2bdd1SGireesh Nagabhushana uint8_t tx_chan; /* tx channel used by the eq */ 229*56b2bdd1SGireesh Nagabhushana uint32_t cntxt_id; /* SGE context id for the eq */ 230*56b2bdd1SGireesh Nagabhushana }; 231*56b2bdd1SGireesh Nagabhushana 232*56b2bdd1SGireesh Nagabhushana enum { 233*56b2bdd1SGireesh Nagabhushana /* fl flags */ 234*56b2bdd1SGireesh Nagabhushana FL_MTX = (1 << 0), /* mutex has been initialized */ 235*56b2bdd1SGireesh Nagabhushana FL_STARVING = (1 << 1), /* on the list of starving fl's */ 236*56b2bdd1SGireesh Nagabhushana FL_DOOMED = (1 << 2), /* about to be destroyed */ 237*56b2bdd1SGireesh Nagabhushana }; 238*56b2bdd1SGireesh Nagabhushana 239*56b2bdd1SGireesh Nagabhushana #define FL_RUNNING_LOW(fl) (fl->cap - fl->needed <= fl->lowat) 240*56b2bdd1SGireesh Nagabhushana #define FL_NOT_RUNNING_LOW(fl) (fl->cap - fl->needed >= 2 * fl->lowat) 241*56b2bdd1SGireesh Nagabhushana 242*56b2bdd1SGireesh Nagabhushana struct sge_fl { 243*56b2bdd1SGireesh Nagabhushana unsigned int flags; 244*56b2bdd1SGireesh Nagabhushana kmutex_t lock; 245*56b2bdd1SGireesh Nagabhushana ddi_dma_handle_t dhdl; 246*56b2bdd1SGireesh Nagabhushana ddi_acc_handle_t ahdl; 247*56b2bdd1SGireesh Nagabhushana 248*56b2bdd1SGireesh Nagabhushana __be64 *desc; /* KVA of descriptor ring, ptr to addresses */ 249*56b2bdd1SGireesh Nagabhushana uint64_t ba; /* bus address of descriptor ring */ 250*56b2bdd1SGireesh Nagabhushana struct fl_sdesc *sdesc; /* KVA of software descriptor ring */ 251*56b2bdd1SGireesh Nagabhushana uint32_t cap; /* max # of buffers, for convenience */ 252*56b2bdd1SGireesh Nagabhushana uint16_t qsize; /* size (# of entries) of the queue */ 253*56b2bdd1SGireesh Nagabhushana uint16_t cntxt_id; /* SGE context id for the freelist */ 254*56b2bdd1SGireesh Nagabhushana uint32_t cidx; /* consumer idx (buffer idx, NOT hw desc idx) */ 255*56b2bdd1SGireesh Nagabhushana uint32_t pidx; /* producer idx (buffer idx, NOT hw desc idx) */ 256*56b2bdd1SGireesh Nagabhushana uint32_t needed; /* # of buffers needed to fill up fl. */ 257*56b2bdd1SGireesh Nagabhushana uint32_t lowat; /* # of buffers <= this means fl needs help */ 258*56b2bdd1SGireesh Nagabhushana uint32_t pending; /* # of bufs allocated since last doorbell */ 259*56b2bdd1SGireesh Nagabhushana uint32_t offset; /* current packet within the larger buffer */ 260*56b2bdd1SGireesh Nagabhushana uint16_t copy_threshold; /* anything this size or less is copied up */ 261*56b2bdd1SGireesh Nagabhushana 262*56b2bdd1SGireesh Nagabhushana uint64_t copied_up; /* # of frames copied into mblk and handed up */ 263*56b2bdd1SGireesh Nagabhushana uint64_t passed_up; /* # of frames wrapped in mblk and handed up */ 264*56b2bdd1SGireesh Nagabhushana 265*56b2bdd1SGireesh Nagabhushana TAILQ_ENTRY(sge_fl) link; /* All starving freelists */ 266*56b2bdd1SGireesh Nagabhushana }; 267*56b2bdd1SGireesh Nagabhushana 268*56b2bdd1SGireesh Nagabhushana /* txq: SGE egress queue + miscellaneous items */ 269*56b2bdd1SGireesh Nagabhushana struct sge_txq { 270*56b2bdd1SGireesh Nagabhushana struct sge_eq eq; /* MUST be first */ 271*56b2bdd1SGireesh Nagabhushana 272*56b2bdd1SGireesh Nagabhushana struct port_info *port; /* the port this txq belongs to */ 273*56b2bdd1SGireesh Nagabhushana struct tx_sdesc *sdesc; /* KVA of software descriptor ring */ 274*56b2bdd1SGireesh Nagabhushana 275*56b2bdd1SGireesh Nagabhushana /* DMA handles used for tx */ 276*56b2bdd1SGireesh Nagabhushana ddi_dma_handle_t *tx_dhdl; 277*56b2bdd1SGireesh Nagabhushana uint32_t tx_dhdl_total; /* Total # of handles */ 278*56b2bdd1SGireesh Nagabhushana uint32_t tx_dhdl_pidx; /* next handle to be used */ 279*56b2bdd1SGireesh Nagabhushana uint32_t tx_dhdl_cidx; /* reclaimed up to this index */ 280*56b2bdd1SGireesh Nagabhushana uint32_t tx_dhdl_avail; /* # of available handles */ 281*56b2bdd1SGireesh Nagabhushana 282*56b2bdd1SGireesh Nagabhushana /* Copy buffers for tx */ 283*56b2bdd1SGireesh Nagabhushana ddi_dma_handle_t txb_dhdl; 284*56b2bdd1SGireesh Nagabhushana ddi_acc_handle_t txb_ahdl; 285*56b2bdd1SGireesh Nagabhushana caddr_t txb_va; /* KVA of copy buffers area */ 286*56b2bdd1SGireesh Nagabhushana uint64_t txb_ba; /* bus address of copy buffers area */ 287*56b2bdd1SGireesh Nagabhushana uint32_t txb_size; /* total size */ 288*56b2bdd1SGireesh Nagabhushana uint32_t txb_next; /* offset of next useable area in the buffer */ 289*56b2bdd1SGireesh Nagabhushana uint32_t txb_avail; /* # of bytes available */ 290*56b2bdd1SGireesh Nagabhushana uint16_t copy_threshold; /* anything this size or less is copied up */ 291*56b2bdd1SGireesh Nagabhushana 292*56b2bdd1SGireesh Nagabhushana kstat_t *ksp; 293*56b2bdd1SGireesh Nagabhushana 294*56b2bdd1SGireesh Nagabhushana /* stats for common events first */ 295*56b2bdd1SGireesh Nagabhushana 296*56b2bdd1SGireesh Nagabhushana uint64_t txcsum; /* # of times hardware assisted with checksum */ 297*56b2bdd1SGireesh Nagabhushana uint64_t tso_wrs; /* # of IPv4 TSO work requests */ 298*56b2bdd1SGireesh Nagabhushana uint64_t imm_wrs; /* # of work requests with immediate data */ 299*56b2bdd1SGireesh Nagabhushana uint64_t sgl_wrs; /* # of work requests with direct SGL */ 300*56b2bdd1SGireesh Nagabhushana uint64_t txpkt_wrs; /* # of txpkt work requests (not coalesced) */ 301*56b2bdd1SGireesh Nagabhushana uint64_t txpkts_wrs; /* # of coalesced tx work requests */ 302*56b2bdd1SGireesh Nagabhushana uint64_t txpkts_pkts; /* # of frames in coalesced tx work requests */ 303*56b2bdd1SGireesh Nagabhushana uint64_t txb_used; /* # of tx copy buffers used (64 byte each) */ 304*56b2bdd1SGireesh Nagabhushana uint64_t hdl_used; /* # of DMA handles used */ 305*56b2bdd1SGireesh Nagabhushana 306*56b2bdd1SGireesh Nagabhushana /* stats for not-that-common events */ 307*56b2bdd1SGireesh Nagabhushana 308*56b2bdd1SGireesh Nagabhushana uint32_t txb_full; /* txb ran out of space */ 309*56b2bdd1SGireesh Nagabhushana uint32_t dma_hdl_failed; /* couldn't obtain DMA handle */ 310*56b2bdd1SGireesh Nagabhushana uint32_t dma_map_failed; /* couldn't obtain DMA mapping */ 311*56b2bdd1SGireesh Nagabhushana uint32_t qfull; /* out of hardware descriptors */ 312*56b2bdd1SGireesh Nagabhushana uint32_t qflush; /* # of SGE_EGR_UPDATE notifications for txq */ 313*56b2bdd1SGireesh Nagabhushana uint32_t pullup_early; /* # of pullups before starting frame's SGL */ 314*56b2bdd1SGireesh Nagabhushana uint32_t pullup_late; /* # of pullups while building frame's SGL */ 315*56b2bdd1SGireesh Nagabhushana uint32_t pullup_failed; /* # of failed pullups */ 316*56b2bdd1SGireesh Nagabhushana }; 317*56b2bdd1SGireesh Nagabhushana 318*56b2bdd1SGireesh Nagabhushana /* rxq: SGE ingress queue + SGE free list + miscellaneous items */ 319*56b2bdd1SGireesh Nagabhushana struct sge_rxq { 320*56b2bdd1SGireesh Nagabhushana struct sge_iq iq; /* MUST be first */ 321*56b2bdd1SGireesh Nagabhushana struct sge_fl fl; 322*56b2bdd1SGireesh Nagabhushana 323*56b2bdd1SGireesh Nagabhushana struct port_info *port; /* the port this rxq belongs to */ 324*56b2bdd1SGireesh Nagabhushana kstat_t *ksp; 325*56b2bdd1SGireesh Nagabhushana 326*56b2bdd1SGireesh Nagabhushana /* stats for common events first */ 327*56b2bdd1SGireesh Nagabhushana 328*56b2bdd1SGireesh Nagabhushana uint64_t rxcsum; /* # of times hardware assisted with checksum */ 329*56b2bdd1SGireesh Nagabhushana 330*56b2bdd1SGireesh Nagabhushana /* stats for not-that-common events */ 331*56b2bdd1SGireesh Nagabhushana 332*56b2bdd1SGireesh Nagabhushana uint32_t nomem; /* mblk allocation during rx failed */ 333*56b2bdd1SGireesh Nagabhushana }; 334*56b2bdd1SGireesh Nagabhushana 335*56b2bdd1SGireesh Nagabhushana #ifndef TCP_OFFLOAD_DISABLE 336*56b2bdd1SGireesh Nagabhushana /* ofld_rxq: SGE ingress queue + SGE free list + miscellaneous items */ 337*56b2bdd1SGireesh Nagabhushana struct sge_ofld_rxq { 338*56b2bdd1SGireesh Nagabhushana struct sge_iq iq; /* MUST be first */ 339*56b2bdd1SGireesh Nagabhushana struct sge_fl fl; 340*56b2bdd1SGireesh Nagabhushana }; 341*56b2bdd1SGireesh Nagabhushana 342*56b2bdd1SGireesh Nagabhushana /* 343*56b2bdd1SGireesh Nagabhushana * wrq: SGE egress queue that is given prebuilt work requests. Both the control 344*56b2bdd1SGireesh Nagabhushana * and offload tx queues are of this type. 345*56b2bdd1SGireesh Nagabhushana */ 346*56b2bdd1SGireesh Nagabhushana struct sge_wrq { 347*56b2bdd1SGireesh Nagabhushana struct sge_eq eq; /* MUST be first */ 348*56b2bdd1SGireesh Nagabhushana 349*56b2bdd1SGireesh Nagabhushana struct adapter *adapter; 350*56b2bdd1SGireesh Nagabhushana 351*56b2bdd1SGireesh Nagabhushana /* List of WRs held up due to lack of tx descriptors */ 352*56b2bdd1SGireesh Nagabhushana struct mblk_pair wr_list; 353*56b2bdd1SGireesh Nagabhushana 354*56b2bdd1SGireesh Nagabhushana /* stats for common events first */ 355*56b2bdd1SGireesh Nagabhushana 356*56b2bdd1SGireesh Nagabhushana uint64_t tx_wrs; /* # of tx work requests */ 357*56b2bdd1SGireesh Nagabhushana 358*56b2bdd1SGireesh Nagabhushana /* stats for not-that-common events */ 359*56b2bdd1SGireesh Nagabhushana 360*56b2bdd1SGireesh Nagabhushana uint32_t no_desc; /* out of hardware descriptors */ 361*56b2bdd1SGireesh Nagabhushana }; 362*56b2bdd1SGireesh Nagabhushana #endif 363*56b2bdd1SGireesh Nagabhushana 364*56b2bdd1SGireesh Nagabhushana struct sge { 365*56b2bdd1SGireesh Nagabhushana int fl_starve_threshold; 366*56b2bdd1SGireesh Nagabhushana 367*56b2bdd1SGireesh Nagabhushana int nrxq; /* total rx queues (all ports and the rest) */ 368*56b2bdd1SGireesh Nagabhushana int ntxq; /* total tx queues (all ports and the rest) */ 369*56b2bdd1SGireesh Nagabhushana #ifndef TCP_OFFLOAD_DISABLE 370*56b2bdd1SGireesh Nagabhushana int nofldrxq; /* total # of TOE rx queues */ 371*56b2bdd1SGireesh Nagabhushana int nofldtxq; /* total # of TOE tx queues */ 372*56b2bdd1SGireesh Nagabhushana #endif 373*56b2bdd1SGireesh Nagabhushana int niq; /* total ingress queues */ 374*56b2bdd1SGireesh Nagabhushana int neq; /* total egress queues */ 375*56b2bdd1SGireesh Nagabhushana 376*56b2bdd1SGireesh Nagabhushana struct sge_iq fwq; /* Firmware event queue */ 377*56b2bdd1SGireesh Nagabhushana struct sge_wrq mgmtq; /* Management queue (Control queue) */ 378*56b2bdd1SGireesh Nagabhushana struct sge_txq *txq; /* NIC tx queues */ 379*56b2bdd1SGireesh Nagabhushana struct sge_rxq *rxq; /* NIC rx queues */ 380*56b2bdd1SGireesh Nagabhushana #ifndef TCP_OFFLOAD_DISABLE 381*56b2bdd1SGireesh Nagabhushana struct sge_wrq *ctrlq; /* Control queues */ 382*56b2bdd1SGireesh Nagabhushana struct sge_wrq *ofld_txq; /* TOE tx queues */ 383*56b2bdd1SGireesh Nagabhushana struct sge_ofld_rxq *ofld_rxq; /* TOE rx queues */ 384*56b2bdd1SGireesh Nagabhushana #endif 385*56b2bdd1SGireesh Nagabhushana 386*56b2bdd1SGireesh Nagabhushana uint16_t iq_start; 387*56b2bdd1SGireesh Nagabhushana int eq_start; 388*56b2bdd1SGireesh Nagabhushana struct sge_iq **iqmap; /* iq->cntxt_id to iq mapping */ 389*56b2bdd1SGireesh Nagabhushana struct sge_eq **eqmap; /* eq->cntxt_id to eq mapping */ 390*56b2bdd1SGireesh Nagabhushana 391*56b2bdd1SGireesh Nagabhushana /* Device access and DMA attributes for all the descriptor rings */ 392*56b2bdd1SGireesh Nagabhushana ddi_device_acc_attr_t acc_attr_desc; 393*56b2bdd1SGireesh Nagabhushana ddi_dma_attr_t dma_attr_desc; 394*56b2bdd1SGireesh Nagabhushana 395*56b2bdd1SGireesh Nagabhushana /* Device access and DMA attributes for tx buffers */ 396*56b2bdd1SGireesh Nagabhushana ddi_device_acc_attr_t acc_attr_tx; 397*56b2bdd1SGireesh Nagabhushana ddi_dma_attr_t dma_attr_tx; 398*56b2bdd1SGireesh Nagabhushana 399*56b2bdd1SGireesh Nagabhushana /* Device access and DMA attributes for rx buffers are in rxb_params */ 400*56b2bdd1SGireesh Nagabhushana kmem_cache_t *rxbuf_cache; 401*56b2bdd1SGireesh Nagabhushana struct rxbuf_cache_params rxb_params; 402*56b2bdd1SGireesh Nagabhushana }; 403*56b2bdd1SGireesh Nagabhushana 404*56b2bdd1SGireesh Nagabhushana struct driver_properties { 405*56b2bdd1SGireesh Nagabhushana /* There is a driver.conf variable for each of these */ 406*56b2bdd1SGireesh Nagabhushana int max_ntxq_10g; 407*56b2bdd1SGireesh Nagabhushana int max_nrxq_10g; 408*56b2bdd1SGireesh Nagabhushana int max_ntxq_1g; 409*56b2bdd1SGireesh Nagabhushana int max_nrxq_1g; 410*56b2bdd1SGireesh Nagabhushana #ifndef TCP_OFFLOAD_DISABLE 411*56b2bdd1SGireesh Nagabhushana int max_nofldtxq_10g; 412*56b2bdd1SGireesh Nagabhushana int max_nofldrxq_10g; 413*56b2bdd1SGireesh Nagabhushana int max_nofldtxq_1g; 414*56b2bdd1SGireesh Nagabhushana int max_nofldrxq_1g; 415*56b2bdd1SGireesh Nagabhushana #endif 416*56b2bdd1SGireesh Nagabhushana int intr_types; 417*56b2bdd1SGireesh Nagabhushana int tmr_idx_10g; 418*56b2bdd1SGireesh Nagabhushana int pktc_idx_10g; 419*56b2bdd1SGireesh Nagabhushana int tmr_idx_1g; 420*56b2bdd1SGireesh Nagabhushana int pktc_idx_1g; 421*56b2bdd1SGireesh Nagabhushana int qsize_txq; 422*56b2bdd1SGireesh Nagabhushana int qsize_rxq; 423*56b2bdd1SGireesh Nagabhushana 424*56b2bdd1SGireesh Nagabhushana int timer_val[SGE_NTIMERS]; 425*56b2bdd1SGireesh Nagabhushana int counter_val[SGE_NCOUNTERS]; 426*56b2bdd1SGireesh Nagabhushana }; 427*56b2bdd1SGireesh Nagabhushana 428*56b2bdd1SGireesh Nagabhushana struct rss_header; 429*56b2bdd1SGireesh Nagabhushana typedef int (*cpl_handler_t)(struct sge_iq *, const struct rss_header *, 430*56b2bdd1SGireesh Nagabhushana mblk_t *); 431*56b2bdd1SGireesh Nagabhushana 432*56b2bdd1SGireesh Nagabhushana struct adapter { 433*56b2bdd1SGireesh Nagabhushana SLIST_ENTRY(adapter) link; 434*56b2bdd1SGireesh Nagabhushana dev_info_t *dip; 435*56b2bdd1SGireesh Nagabhushana dev_t dev; 436*56b2bdd1SGireesh Nagabhushana 437*56b2bdd1SGireesh Nagabhushana unsigned int pf; 438*56b2bdd1SGireesh Nagabhushana unsigned int mbox; 439*56b2bdd1SGireesh Nagabhushana 440*56b2bdd1SGireesh Nagabhushana uint_t open; /* character device is open */ 441*56b2bdd1SGireesh Nagabhushana 442*56b2bdd1SGireesh Nagabhushana /* PCI config space access handle */ 443*56b2bdd1SGireesh Nagabhushana ddi_acc_handle_t pci_regh; 444*56b2bdd1SGireesh Nagabhushana 445*56b2bdd1SGireesh Nagabhushana /* MMIO register access handle */ 446*56b2bdd1SGireesh Nagabhushana ddi_acc_handle_t regh; 447*56b2bdd1SGireesh Nagabhushana caddr_t regp; 448*56b2bdd1SGireesh Nagabhushana 449*56b2bdd1SGireesh Nagabhushana /* Interrupt information */ 450*56b2bdd1SGireesh Nagabhushana int intr_type; 451*56b2bdd1SGireesh Nagabhushana int intr_count; 452*56b2bdd1SGireesh Nagabhushana int intr_cap; 453*56b2bdd1SGireesh Nagabhushana uint_t intr_pri; 454*56b2bdd1SGireesh Nagabhushana ddi_intr_handle_t *intr_handle; 455*56b2bdd1SGireesh Nagabhushana 456*56b2bdd1SGireesh Nagabhushana struct driver_properties props; 457*56b2bdd1SGireesh Nagabhushana kstat_t *ksp; 458*56b2bdd1SGireesh Nagabhushana 459*56b2bdd1SGireesh Nagabhushana struct sge sge; 460*56b2bdd1SGireesh Nagabhushana 461*56b2bdd1SGireesh Nagabhushana struct port_info *port[MAX_NPORTS]; 462*56b2bdd1SGireesh Nagabhushana uint8_t chan_map[NCHAN]; 463*56b2bdd1SGireesh Nagabhushana uint32_t filter_mode; 464*56b2bdd1SGireesh Nagabhushana 465*56b2bdd1SGireesh Nagabhushana struct l2t_data *l2t; /* L2 table */ 466*56b2bdd1SGireesh Nagabhushana struct tid_info tids; 467*56b2bdd1SGireesh Nagabhushana 468*56b2bdd1SGireesh Nagabhushana int registered_device_map; 469*56b2bdd1SGireesh Nagabhushana int open_device_map; 470*56b2bdd1SGireesh Nagabhushana int flags; 471*56b2bdd1SGireesh Nagabhushana 472*56b2bdd1SGireesh Nagabhushana unsigned int cfcsum; 473*56b2bdd1SGireesh Nagabhushana struct adapter_params params; 474*56b2bdd1SGireesh Nagabhushana struct t4_virt_res vres; 475*56b2bdd1SGireesh Nagabhushana 476*56b2bdd1SGireesh Nagabhushana #ifndef TCP_OFFLOAD_DISABLE 477*56b2bdd1SGireesh Nagabhushana struct uld_softc tom; 478*56b2bdd1SGireesh Nagabhushana struct tom_tunables tt; 479*56b2bdd1SGireesh Nagabhushana #endif 480*56b2bdd1SGireesh Nagabhushana 481*56b2bdd1SGireesh Nagabhushana #ifndef TCP_OFFLOAD_DISABLE 482*56b2bdd1SGireesh Nagabhushana int offload_map; 483*56b2bdd1SGireesh Nagabhushana #endif 484*56b2bdd1SGireesh Nagabhushana uint16_t linkcaps; 485*56b2bdd1SGireesh Nagabhushana uint16_t niccaps; 486*56b2bdd1SGireesh Nagabhushana uint16_t toecaps; 487*56b2bdd1SGireesh Nagabhushana uint16_t rdmacaps; 488*56b2bdd1SGireesh Nagabhushana uint16_t iscsicaps; 489*56b2bdd1SGireesh Nagabhushana uint16_t fcoecaps; 490*56b2bdd1SGireesh Nagabhushana 491*56b2bdd1SGireesh Nagabhushana cpl_handler_t cpl_handler[0xef]; /* NUM_CPL_CMDS */ 492*56b2bdd1SGireesh Nagabhushana 493*56b2bdd1SGireesh Nagabhushana kmutex_t lock; 494*56b2bdd1SGireesh Nagabhushana kcondvar_t cv; 495*56b2bdd1SGireesh Nagabhushana 496*56b2bdd1SGireesh Nagabhushana /* Starving free lists */ 497*56b2bdd1SGireesh Nagabhushana kmutex_t sfl_lock; /* same cache-line as sc_lock? but that's ok */ 498*56b2bdd1SGireesh Nagabhushana TAILQ_HEAD(, sge_fl) sfl; 499*56b2bdd1SGireesh Nagabhushana timeout_id_t sfl_timer; 500*56b2bdd1SGireesh Nagabhushana }; 501*56b2bdd1SGireesh Nagabhushana 502*56b2bdd1SGireesh Nagabhushana enum { 503*56b2bdd1SGireesh Nagabhushana NIC_H = 0, 504*56b2bdd1SGireesh Nagabhushana TOM_H, 505*56b2bdd1SGireesh Nagabhushana IW_H, 506*56b2bdd1SGireesh Nagabhushana ISCSI_H 507*56b2bdd1SGireesh Nagabhushana }; 508*56b2bdd1SGireesh Nagabhushana 509*56b2bdd1SGireesh Nagabhushana #define ADAPTER_LOCK(sc) mutex_enter(&(sc)->lock) 510*56b2bdd1SGireesh Nagabhushana #define ADAPTER_UNLOCK(sc) mutex_exit(&(sc)->lock) 511*56b2bdd1SGireesh Nagabhushana #define ADAPTER_LOCK_ASSERT_OWNED(sc) ASSERT(mutex_owned(&(sc)->lock)) 512*56b2bdd1SGireesh Nagabhushana #define ADAPTER_LOCK_ASSERT_NOTOWNED(sc) ASSERT(!mutex_owned(&(sc)->lock)) 513*56b2bdd1SGireesh Nagabhushana 514*56b2bdd1SGireesh Nagabhushana #define PORT_LOCK(pi) mutex_enter(&(pi)->lock) 515*56b2bdd1SGireesh Nagabhushana #define PORT_UNLOCK(pi) mutex_exit(&(pi)->lock) 516*56b2bdd1SGireesh Nagabhushana #define PORT_LOCK_ASSERT_OWNED(pi) ASSERT(mutex_owned(&(pi)->lock)) 517*56b2bdd1SGireesh Nagabhushana #define PORT_LOCK_ASSERT_NOTOWNED(pi) ASSERT(!mutex_owned(&(pi)->lock)) 518*56b2bdd1SGireesh Nagabhushana 519*56b2bdd1SGireesh Nagabhushana #define IQ_LOCK(iq) mutex_enter(&(iq)->lock) 520*56b2bdd1SGireesh Nagabhushana #define IQ_UNLOCK(iq) mutex_exit(&(iq)->lock) 521*56b2bdd1SGireesh Nagabhushana #define IQ_LOCK_ASSERT_OWNED(iq) ASSERT(mutex_owned(&(iq)->lock)) 522*56b2bdd1SGireesh Nagabhushana #define IQ_LOCK_ASSERT_NOTOWNED(iq) ASSERT(!mutex_owned(&(iq)->lock)) 523*56b2bdd1SGireesh Nagabhushana 524*56b2bdd1SGireesh Nagabhushana #define FL_LOCK(fl) mutex_enter(&(fl)->lock) 525*56b2bdd1SGireesh Nagabhushana #define FL_UNLOCK(fl) mutex_exit(&(fl)->lock) 526*56b2bdd1SGireesh Nagabhushana #define FL_LOCK_ASSERT_OWNED(fl) ASSERT(mutex_owned(&(fl)->lock)) 527*56b2bdd1SGireesh Nagabhushana #define FL_LOCK_ASSERT_NOTOWNED(fl) ASSERT(!mutex_owned(&(fl)->lock)) 528*56b2bdd1SGireesh Nagabhushana 529*56b2bdd1SGireesh Nagabhushana #define RXQ_LOCK(rxq) IQ_LOCK(&(rxq)->iq) 530*56b2bdd1SGireesh Nagabhushana #define RXQ_UNLOCK(rxq) IQ_UNLOCK(&(rxq)->iq) 531*56b2bdd1SGireesh Nagabhushana #define RXQ_LOCK_ASSERT_OWNED(rxq) IQ_LOCK_ASSERT_OWNED(&(rxq)->iq) 532*56b2bdd1SGireesh Nagabhushana #define RXQ_LOCK_ASSERT_NOTOWNED(rxq) IQ_LOCK_ASSERT_NOTOWNED(&(rxq)->iq) 533*56b2bdd1SGireesh Nagabhushana 534*56b2bdd1SGireesh Nagabhushana #define RXQ_FL_LOCK(rxq) FL_LOCK(&(rxq)->fl) 535*56b2bdd1SGireesh Nagabhushana #define RXQ_FL_UNLOCK(rxq) FL_UNLOCK(&(rxq)->fl) 536*56b2bdd1SGireesh Nagabhushana #define RXQ_FL_LOCK_ASSERT_OWNED(rxq) FL_LOCK_ASSERT_OWNED(&(rxq)->fl) 537*56b2bdd1SGireesh Nagabhushana #define RXQ_FL_LOCK_ASSERT_NOTOWNED(rxq) FL_LOCK_ASSERT_NOTOWNED(&(rxq)->fl) 538*56b2bdd1SGireesh Nagabhushana 539*56b2bdd1SGireesh Nagabhushana #define EQ_LOCK(eq) mutex_enter(&(eq)->lock) 540*56b2bdd1SGireesh Nagabhushana #define EQ_UNLOCK(eq) mutex_exit(&(eq)->lock) 541*56b2bdd1SGireesh Nagabhushana #define EQ_LOCK_ASSERT_OWNED(eq) ASSERT(mutex_owned(&(eq)->lock)) 542*56b2bdd1SGireesh Nagabhushana #define EQ_LOCK_ASSERT_NOTOWNED(eq) ASSERT(!mutex_owned(&(eq)->lock)) 543*56b2bdd1SGireesh Nagabhushana 544*56b2bdd1SGireesh Nagabhushana #define TXQ_LOCK(txq) EQ_LOCK(&(txq)->eq) 545*56b2bdd1SGireesh Nagabhushana #define TXQ_UNLOCK(txq) EQ_UNLOCK(&(txq)->eq) 546*56b2bdd1SGireesh Nagabhushana #define TXQ_LOCK_ASSERT_OWNED(txq) EQ_LOCK_ASSERT_OWNED(&(txq)->eq) 547*56b2bdd1SGireesh Nagabhushana #define TXQ_LOCK_ASSERT_NOTOWNED(txq) EQ_LOCK_ASSERT_NOTOWNED(&(txq)->eq) 548*56b2bdd1SGireesh Nagabhushana 549*56b2bdd1SGireesh Nagabhushana #define for_each_txq(pi, iter, txq) \ 550*56b2bdd1SGireesh Nagabhushana txq = &pi->adapter->sge.txq[pi->first_txq]; \ 551*56b2bdd1SGireesh Nagabhushana for (iter = 0; iter < pi->ntxq; ++iter, ++txq) 552*56b2bdd1SGireesh Nagabhushana #define for_each_rxq(pi, iter, rxq) \ 553*56b2bdd1SGireesh Nagabhushana rxq = &pi->adapter->sge.rxq[pi->first_rxq]; \ 554*56b2bdd1SGireesh Nagabhushana for (iter = 0; iter < pi->nrxq; ++iter, ++rxq) 555*56b2bdd1SGireesh Nagabhushana #define for_each_ofld_txq(pi, iter, ofld_txq) \ 556*56b2bdd1SGireesh Nagabhushana ofld_txq = &pi->adapter->sge.ofld_txq[pi->first_ofld_txq]; \ 557*56b2bdd1SGireesh Nagabhushana for (iter = 0; iter < pi->nofldtxq; ++iter, ++ofld_txq) 558*56b2bdd1SGireesh Nagabhushana #define for_each_ofld_rxq(pi, iter, ofld_rxq) \ 559*56b2bdd1SGireesh Nagabhushana ofld_rxq = &pi->adapter->sge.ofld_rxq[pi->first_ofld_rxq]; \ 560*56b2bdd1SGireesh Nagabhushana for (iter = 0; iter < pi->nofldrxq; ++iter, ++ofld_rxq) 561*56b2bdd1SGireesh Nagabhushana 562*56b2bdd1SGireesh Nagabhushana #define NFIQ(sc) ((sc)->intr_count > 1 ? (sc)->intr_count - 1 : 1) 563*56b2bdd1SGireesh Nagabhushana 564*56b2bdd1SGireesh Nagabhushana /* One for errors, one for firmware events */ 565*56b2bdd1SGireesh Nagabhushana #define T4_EXTRA_INTR 2 566*56b2bdd1SGireesh Nagabhushana 567*56b2bdd1SGireesh Nagabhushana /* adapter.c */ 568*56b2bdd1SGireesh Nagabhushana uint32_t t4_read_reg(struct adapter *sc, uint32_t reg); 569*56b2bdd1SGireesh Nagabhushana void t4_write_reg(struct adapter *sc, uint32_t reg, uint32_t val); 570*56b2bdd1SGireesh Nagabhushana void t4_os_pci_read_cfg1(struct adapter *sc, int reg, uint8_t *val); 571*56b2bdd1SGireesh Nagabhushana void t4_os_pci_write_cfg1(struct adapter *sc, int reg, uint8_t val); 572*56b2bdd1SGireesh Nagabhushana void t4_os_pci_read_cfg2(struct adapter *sc, int reg, uint16_t *val); 573*56b2bdd1SGireesh Nagabhushana void t4_os_pci_write_cfg2(struct adapter *sc, int reg, uint16_t val); 574*56b2bdd1SGireesh Nagabhushana void t4_os_pci_read_cfg4(struct adapter *sc, int reg, uint32_t *val); 575*56b2bdd1SGireesh Nagabhushana void t4_os_pci_write_cfg4(struct adapter *sc, int reg, uint32_t val); 576*56b2bdd1SGireesh Nagabhushana uint64_t t4_read_reg64(struct adapter *sc, uint32_t reg); 577*56b2bdd1SGireesh Nagabhushana void t4_write_reg64(struct adapter *sc, uint32_t reg, uint64_t val); 578*56b2bdd1SGireesh Nagabhushana struct port_info *adap2pinfo(struct adapter *sc, int idx); 579*56b2bdd1SGireesh Nagabhushana void t4_os_set_hw_addr(struct adapter *sc, int idx, uint8_t hw_addr[]); 580*56b2bdd1SGireesh Nagabhushana bool is_10G_port(const struct port_info *pi); 581*56b2bdd1SGireesh Nagabhushana struct sge_rxq *iq_to_rxq(struct sge_iq *iq); 582*56b2bdd1SGireesh Nagabhushana int t4_wrq_tx(struct adapter *sc, struct sge_wrq *wrq, mblk_t *m); 583*56b2bdd1SGireesh Nagabhushana 584*56b2bdd1SGireesh Nagabhushana /* t4_nexus.c */ 585*56b2bdd1SGireesh Nagabhushana int t4_os_find_pci_capability(struct adapter *sc, int cap); 586*56b2bdd1SGireesh Nagabhushana void t4_os_portmod_changed(const struct adapter *sc, int idx); 587*56b2bdd1SGireesh Nagabhushana int adapter_full_init(struct adapter *sc); 588*56b2bdd1SGireesh Nagabhushana int adapter_full_uninit(struct adapter *sc); 589*56b2bdd1SGireesh Nagabhushana int port_full_init(struct port_info *pi); 590*56b2bdd1SGireesh Nagabhushana int port_full_uninit(struct port_info *pi); 591*56b2bdd1SGireesh Nagabhushana void enable_port_queues(struct port_info *pi); 592*56b2bdd1SGireesh Nagabhushana void disable_port_queues(struct port_info *pi); 593*56b2bdd1SGireesh Nagabhushana int t4_register_cpl_handler(struct adapter *sc, int opcode, cpl_handler_t h); 594*56b2bdd1SGireesh Nagabhushana void t4_iterate(void (*func)(int, void *), void *arg); 595*56b2bdd1SGireesh Nagabhushana 596*56b2bdd1SGireesh Nagabhushana /* t4_sge.c */ 597*56b2bdd1SGireesh Nagabhushana void t4_sge_init(struct adapter *sc); 598*56b2bdd1SGireesh Nagabhushana int t4_setup_adapter_queues(struct adapter *sc); 599*56b2bdd1SGireesh Nagabhushana int t4_teardown_adapter_queues(struct adapter *sc); 600*56b2bdd1SGireesh Nagabhushana int t4_setup_port_queues(struct port_info *pi); 601*56b2bdd1SGireesh Nagabhushana int t4_teardown_port_queues(struct port_info *pi); 602*56b2bdd1SGireesh Nagabhushana uint_t t4_intr_all(caddr_t arg1, caddr_t arg2); 603*56b2bdd1SGireesh Nagabhushana uint_t t4_intr(caddr_t arg1, caddr_t arg2); 604*56b2bdd1SGireesh Nagabhushana uint_t t4_intr_err(caddr_t arg1, caddr_t arg2); 605*56b2bdd1SGireesh Nagabhushana int t4_mgmt_tx(struct adapter *sc, mblk_t *m); 606*56b2bdd1SGireesh Nagabhushana int t4_wrq_tx_locked(struct adapter *sc, struct sge_wrq *wrq, mblk_t *m0); 607*56b2bdd1SGireesh Nagabhushana 608*56b2bdd1SGireesh Nagabhushana mblk_t *t4_eth_tx(struct port_info *pi, struct sge_txq *txq, mblk_t *frame); 609*56b2bdd1SGireesh Nagabhushana int t4_alloc_tx_maps(struct adapter *sc, struct tx_maps *txmaps, int count, 610*56b2bdd1SGireesh Nagabhushana int flags); 611*56b2bdd1SGireesh Nagabhushana 612*56b2bdd1SGireesh Nagabhushana /* t4_mac.c */ 613*56b2bdd1SGireesh Nagabhushana void t4_mc_init(struct port_info *pi); 614*56b2bdd1SGireesh Nagabhushana void t4_os_link_changed(struct adapter *sc, int idx, int link_stat); 615*56b2bdd1SGireesh Nagabhushana void t4_mac_rx(struct port_info *pi, struct sge_rxq *rxq, mblk_t *m); 616*56b2bdd1SGireesh Nagabhushana 617*56b2bdd1SGireesh Nagabhushana /* t4_ioctl.c */ 618*56b2bdd1SGireesh Nagabhushana int t4_ioctl(struct adapter *sc, int cmd, void *data, int mode); 619*56b2bdd1SGireesh Nagabhushana 620*56b2bdd1SGireesh Nagabhushana struct l2t_data *t4_init_l2t(struct adapter *sc); 621*56b2bdd1SGireesh Nagabhushana #endif /* __CXGBE_ADAPTER_H */ 622