1167514Skmacy/************************************************************************** 2167514Skmacy 3189643SgnnCopyright (c) 2007-2009, Chelsio Inc. 4167514SkmacyAll rights reserved. 5167514Skmacy 6167514SkmacyRedistribution and use in source and binary forms, with or without 7167514Skmacymodification, are permitted provided that the following conditions are met: 8167514Skmacy 9167514Skmacy 1. Redistributions of source code must retain the above copyright notice, 10167514Skmacy this list of conditions and the following disclaimer. 11167514Skmacy 12169978Skmacy 2. Neither the name of the Chelsio Corporation nor the names of its 13167514Skmacy contributors may be used to endorse or promote products derived from 14167514Skmacy this software without specific prior written permission. 15167514Skmacy 16167514SkmacyTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17167514SkmacyAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18167514SkmacyIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19167514SkmacyARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 20167514SkmacyLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21167514SkmacyCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22167514SkmacySUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23167514SkmacyINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24167514SkmacyCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25167514SkmacyARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26167514SkmacyPOSSIBILITY OF SUCH DAMAGE. 27167514Skmacy 28167514Skmacy$FreeBSD$ 29167514Skmacy 30167514Skmacy***************************************************************************/ 31167514Skmacy 32167514Skmacy 33167514Skmacy#ifndef _CXGB_ADAPTER_H_ 34167514Skmacy#define _CXGB_ADAPTER_H_ 35167514Skmacy 36167514Skmacy#include <sys/lock.h> 37167514Skmacy#include <sys/mutex.h> 38167514Skmacy#include <sys/rman.h> 39167514Skmacy#include <sys/mbuf.h> 40167514Skmacy#include <sys/socket.h> 41167514Skmacy#include <sys/sockio.h> 42174708Skmacy#include <sys/condvar.h> 43185162Skmacy#include <sys/buf_ring.h> 44167514Skmacy 45167514Skmacy#include <net/ethernet.h> 46167514Skmacy#include <net/if.h> 47167514Skmacy#include <net/if_media.h> 48176472Skmacy#include <net/if_dl.h> 49238230Sbz#include <netinet/in.h> 50204274Snp#include <netinet/tcp_lro.h> 51167514Skmacy 52167514Skmacy#include <machine/bus.h> 53167514Skmacy#include <machine/resource.h> 54174708Skmacy 55167514Skmacy#include <sys/bus_dma.h> 56167514Skmacy#include <dev/pci/pcireg.h> 57167514Skmacy#include <dev/pci/pcivar.h> 58167514Skmacy 59170654Skmacy#include <cxgb_osdep.h> 60170654Skmacy#include <sys/mbufq.h> 61169978Skmacy 62167514Skmacystruct adapter; 63167514Skmacystruct sge_qset; 64167514Skmacyextern int cxgb_debug; 65167514Skmacy 66170869Skmacy#ifdef DEBUG_LOCKING 67170869Skmacy#define MTX_INIT(lock, lockname, class, flags) \ 68170869Skmacy do { \ 69170869Skmacy printf("initializing %s at %s:%d\n", lockname, __FILE__, __LINE__); \ 70170869Skmacy mtx_init((lock), lockname, class, flags); \ 71170869Skmacy } while (0) 72170869Skmacy 73170869Skmacy#define MTX_DESTROY(lock) \ 74170869Skmacy do { \ 75170869Skmacy printf("destroying %s at %s:%d\n", (lock)->lock_object.lo_name, __FILE__, __LINE__); \ 76170869Skmacy mtx_destroy((lock)); \ 77170869Skmacy } while (0) 78170869Skmacy 79170869Skmacy#else 80170869Skmacy#define MTX_INIT mtx_init 81170869Skmacy#define MTX_DESTROY mtx_destroy 82170869Skmacy#endif 83170869Skmacy 84192540Sgnnenum { 85192540Sgnn LF_NO = 0, 86192540Sgnn LF_MAYBE, 87192540Sgnn LF_YES 88192540Sgnn}; 89192540Sgnn 90167514Skmacystruct port_info { 91167514Skmacy struct adapter *adapter; 92167514Skmacy struct ifnet *ifp; 93167514Skmacy int if_flags; 94194521Skmacy int flags; 95167514Skmacy const struct port_type_info *port_type; 96167514Skmacy struct cphy phy; 97167514Skmacy struct cmac mac; 98167514Skmacy struct link_config link_config; 99170869Skmacy struct ifmedia media; 100167514Skmacy struct mtx lock; 101194521Skmacy uint32_t port_id; 102194521Skmacy uint32_t tx_chan; 103194521Skmacy uint32_t txpkt_intf; 104194521Skmacy uint32_t first_qset; 105175174Skmacy uint32_t nqsets; 106189643Sgnn int link_fault; 107189643Sgnn 108171978Skmacy uint8_t hw_addr[ETHER_ADDR_LEN]; 109209841Snp struct callout link_check_ch; 110209841Snp struct task link_check_task; 111170654Skmacy struct task timer_reclaim_task; 112167514Skmacy struct cdev *port_cdev; 113170869Skmacy 114174708Skmacy#define PORT_LOCK_NAME_LEN 32 115170869Skmacy#define PORT_NAME_LEN 32 116174708Skmacy char lockbuf[PORT_LOCK_NAME_LEN]; 117174708Skmacy char namebuf[PORT_NAME_LEN]; 118194521Skmacy} __aligned(L1_CACHE_BYTES); 119167514Skmacy 120194521Skmacyenum { 121194521Skmacy /* adapter flags */ 122167514Skmacy FULL_INIT_DONE = (1 << 0), 123167514Skmacy USING_MSI = (1 << 1), 124167514Skmacy USING_MSIX = (1 << 2), 125167514Skmacy QUEUES_BOUND = (1 << 3), 126194521Skmacy FW_UPTODATE = (1 << 4), 127194521Skmacy TPS_UPTODATE = (1 << 5), 128176472Skmacy CXGB_SHUTDOWN = (1 << 6), 129176472Skmacy CXGB_OFLD_INIT = (1 << 7), 130194521Skmacy TP_PARITY_INIT = (1 << 8), 131194521Skmacy CXGB_BUSY = (1 << 9), 132237920Snp TOM_INIT_DONE = (1 << 10), 133194521Skmacy 134194521Skmacy /* port flags */ 135194521Skmacy DOOMED = (1 << 0), 136167514Skmacy}; 137194521Skmacy#define IS_DOOMED(p) (p->flags & DOOMED) 138194521Skmacy#define SET_DOOMED(p) do {p->flags |= DOOMED;} while (0) 139194521Skmacy#define IS_BUSY(sc) (sc->flags & CXGB_BUSY) 140194521Skmacy#define SET_BUSY(sc) do {sc->flags |= CXGB_BUSY;} while (0) 141194521Skmacy#define CLR_BUSY(sc) do {sc->flags &= ~CXGB_BUSY;} while (0) 142167514Skmacy 143167514Skmacy#define FL_Q_SIZE 4096 144174708Skmacy#define JUMBO_Q_SIZE 1024 145206109Snp#define RSPQ_Q_SIZE 2048 146167514Skmacy#define TX_ETH_Q_SIZE 1024 147205950Snp#define TX_OFLD_Q_SIZE 1024 148205950Snp#define TX_CTRL_Q_SIZE 256 149167514Skmacy 150174708Skmacyenum { TXQ_ETH = 0, 151174708Skmacy TXQ_OFLD = 1, 152174708Skmacy TXQ_CTRL = 2, }; 153170869Skmacy 154170869Skmacy 155175340Skmacy/* 156175340Skmacy * work request size in bytes 157175340Skmacy */ 158175340Skmacy#define WR_LEN (WR_FLITS * 8) 159180583Skmacy#define PIO_LEN (WR_LEN - sizeof(struct cpl_tx_pkt_lso)) 160175340Skmacy 161169978Skmacystruct lro_state { 162169978Skmacy unsigned short enabled; 163181616Skmacy struct lro_ctrl ctrl; 164167514Skmacy}; 165167514Skmacy 166167514Skmacy#define RX_BUNDLE_SIZE 8 167167514Skmacy 168167514Skmacystruct rsp_desc; 169167514Skmacy 170167514Skmacystruct sge_rspq { 171167514Skmacy uint32_t credits; 172167514Skmacy uint32_t size; 173167514Skmacy uint32_t cidx; 174167514Skmacy uint32_t gen; 175167514Skmacy uint32_t polling; 176167514Skmacy uint32_t holdoff_tmr; 177167514Skmacy uint32_t next_holdoff; 178167514Skmacy uint32_t imm_data; 179176472Skmacy uint32_t async_notif; 180169978Skmacy uint32_t cntxt_id; 181169978Skmacy uint32_t offload_pkts; 182167514Skmacy uint32_t pure_rsps; 183169978Skmacy uint32_t unhandled_irqs; 184206109Snp uint32_t starved; 185169978Skmacy 186167514Skmacy bus_addr_t phys_addr; 187167514Skmacy bus_dma_tag_t desc_tag; 188167514Skmacy bus_dmamap_t desc_map; 189172101Skmacy 190172101Skmacy struct t3_mbuf_hdr rspq_mh; 191175209Skmacy struct rsp_desc *desc; 192175209Skmacy struct mtx lock; 193170869Skmacy#define RSPQ_NAME_LEN 32 194170869Skmacy char lockbuf[RSPQ_NAME_LEN]; 195175209Skmacy uint32_t rspq_dump_start; 196175209Skmacy uint32_t rspq_dump_count; 197167514Skmacy}; 198167514Skmacy 199167514Skmacystruct rx_desc; 200167514Skmacystruct rx_sw_desc; 201167514Skmacy 202167514Skmacystruct sge_fl { 203167514Skmacy uint32_t buf_size; 204167514Skmacy uint32_t credits; 205167514Skmacy uint32_t size; 206167514Skmacy uint32_t cidx; 207167514Skmacy uint32_t pidx; 208167514Skmacy uint32_t gen; 209207688Snp uint32_t db_pending; 210167514Skmacy bus_addr_t phys_addr; 211167514Skmacy uint32_t cntxt_id; 212189643Sgnn uint32_t empty; 213167514Skmacy bus_dma_tag_t desc_tag; 214167514Skmacy bus_dmamap_t desc_map; 215168351Skmacy bus_dma_tag_t entry_tag; 216168351Skmacy uma_zone_t zone; 217175209Skmacy struct rx_desc *desc; 218175209Skmacy struct rx_sw_desc *sdesc; 219168351Skmacy int type; 220167514Skmacy}; 221167514Skmacy 222167514Skmacystruct tx_desc; 223167514Skmacystruct tx_sw_desc; 224167514Skmacy 225171471Skmacy#define TXQ_TRANSMITTING 0x1 226171335Skmacy 227167514Skmacystruct sge_txq { 228167514Skmacy uint64_t flags; 229167514Skmacy uint32_t in_use; 230167514Skmacy uint32_t size; 231167514Skmacy uint32_t processed; 232167514Skmacy uint32_t cleaned; 233167514Skmacy uint32_t stop_thres; 234167514Skmacy uint32_t cidx; 235167514Skmacy uint32_t pidx; 236167514Skmacy uint32_t gen; 237167514Skmacy uint32_t unacked; 238207688Snp uint32_t db_pending; 239167514Skmacy struct tx_desc *desc; 240167514Skmacy struct tx_sw_desc *sdesc; 241167514Skmacy uint32_t token; 242167514Skmacy bus_addr_t phys_addr; 243171335Skmacy struct task qresume_task; 244171335Skmacy struct task qreclaim_task; 245167514Skmacy uint32_t cntxt_id; 246167514Skmacy uint64_t stops; 247167514Skmacy uint64_t restarts; 248167514Skmacy bus_dma_tag_t desc_tag; 249167514Skmacy bus_dmamap_t desc_map; 250168351Skmacy bus_dma_tag_t entry_tag; 251169978Skmacy struct mbuf_head sendq; 252194521Skmacy 253185162Skmacy struct buf_ring *txq_mr; 254185165Skmacy struct ifaltq *txq_ifq; 255194521Skmacy struct callout txq_timer; 256194521Skmacy struct callout txq_watchdog; 257194521Skmacy uint64_t txq_coalesced; 258174708Skmacy uint32_t txq_skipped; 259174708Skmacy uint32_t txq_enqueued; 260175174Skmacy uint32_t txq_dump_start; 261175174Skmacy uint32_t txq_dump_count; 262194521Skmacy uint64_t txq_direct_packets; 263194521Skmacy uint64_t txq_direct_bytes; 264194521Skmacy uint64_t txq_frees; 265174708Skmacy struct sg_ent txq_sgl[TX_MAX_SEGS / 2 + 1]; 266167514Skmacy}; 267167514Skmacy 268181616Skmacy#define SGE_PSTAT_MAX (SGE_PSTAT_VLANINS+1) 269167514Skmacy 270174708Skmacy#define QS_EXITING 0x1 271174708Skmacy#define QS_RUNNING 0x2 272174708Skmacy#define QS_BOUND 0x4 273194521Skmacy#define QS_FLUSHING 0x8 274194521Skmacy#define QS_TIMEOUT 0x10 275174708Skmacy 276167514Skmacystruct sge_qset { 277167514Skmacy struct sge_rspq rspq; 278167514Skmacy struct sge_fl fl[SGE_RXQ_PER_SET]; 279169978Skmacy struct lro_state lro; 280167514Skmacy struct sge_txq txq[SGE_TXQ_PER_SET]; 281169978Skmacy uint32_t txq_stopped; /* which Tx queues are stopped */ 282167514Skmacy struct port_info *port; 283237920Snp struct adapter *adap; 284167760Skmacy int idx; /* qset # */ 285174708Skmacy int qs_flags; 286194521Skmacy int coalescing; 287174708Skmacy struct cv qs_cv; 288194521Skmacy struct mtx lock; 289174708Skmacy#define QS_NAME_LEN 32 290174708Skmacy char namebuf[QS_NAME_LEN]; 291167514Skmacy}; 292167514Skmacy 293167514Skmacystruct sge { 294167514Skmacy struct sge_qset qs[SGE_QSETS]; 295167514Skmacy struct mtx reg_lock; 296167514Skmacy}; 297167514Skmacy 298171471Skmacystruct filter_info; 299171471Skmacy 300237920Snptypedef int (*cpl_handler_t)(struct sge_qset *, struct rsp_desc *, 301237920Snp struct mbuf *); 302237920Snp 303167514Skmacystruct adapter { 304237920Snp SLIST_ENTRY(adapter) link; 305167514Skmacy device_t dev; 306167514Skmacy int flags; 307194521Skmacy 308167514Skmacy /* PCI register resources */ 309171868Skmacy int regs_rid; 310167514Skmacy struct resource *regs_res; 311176472Skmacy int udbs_rid; 312176472Skmacy struct resource *udbs_res; 313167514Skmacy bus_space_handle_t bh; 314167514Skmacy bus_space_tag_t bt; 315167514Skmacy bus_size_t mmio_len; 316167862Skmacy uint32_t link_width; 317167514Skmacy 318167514Skmacy /* DMA resources */ 319167514Skmacy bus_dma_tag_t parent_dmat; 320167514Skmacy bus_dma_tag_t rx_dmat; 321167514Skmacy bus_dma_tag_t rx_jumbo_dmat; 322167514Skmacy bus_dma_tag_t tx_dmat; 323167514Skmacy 324167514Skmacy /* Interrupt resources */ 325167514Skmacy struct resource *irq_res; 326167514Skmacy int irq_rid; 327167514Skmacy void *intr_tag; 328167514Skmacy 329167514Skmacy uint32_t msix_regs_rid; 330167514Skmacy struct resource *msix_regs_res; 331167514Skmacy 332167514Skmacy struct resource *msix_irq_res[SGE_QSETS]; 333167514Skmacy int msix_irq_rid[SGE_QSETS]; 334167514Skmacy void *msix_intr_tag[SGE_QSETS]; 335171471Skmacy uint8_t rxpkt_map[8]; /* maps RX_PKT interface values to port ids */ 336171471Skmacy uint8_t rrss_map[SGE_QSETS]; /* revers RSS map table */ 337174708Skmacy uint16_t rspq_map[RSS_TABLE_SIZE]; /* maps 7-bit cookie to qidx */ 338174708Skmacy union { 339174708Skmacy uint8_t fill[SGE_QSETS]; 340174708Skmacy uint64_t coalesce; 341174708Skmacy } u; 342167514Skmacy 343174708Skmacy#define tunq_fill u.fill 344174708Skmacy#define tunq_coalesce u.coalesce 345174708Skmacy 346171471Skmacy struct filter_info *filters; 347171471Skmacy 348167514Skmacy /* Tasks */ 349167514Skmacy struct task slow_intr_task; 350170869Skmacy struct task tick_task; 351167514Skmacy struct taskqueue *tq; 352167514Skmacy struct callout cxgb_tick_ch; 353167514Skmacy struct callout sge_timer_ch; 354167514Skmacy 355167514Skmacy /* Register lock for use by the hardware layer */ 356167514Skmacy struct mtx mdio_lock; 357170654Skmacy struct mtx elmer_lock; 358167514Skmacy 359167514Skmacy /* Bookkeeping for the hardware layer */ 360167514Skmacy struct adapter_params params; 361167514Skmacy unsigned int slow_intr_mask; 362167514Skmacy unsigned long irq_stats[IRQ_NUM_STATS]; 363167514Skmacy 364167514Skmacy struct sge sge; 365167514Skmacy struct mc7 pmrx; 366167514Skmacy struct mc7 pmtx; 367167514Skmacy struct mc7 cm; 368167514Skmacy struct mc5 mc5; 369167514Skmacy 370167514Skmacy struct port_info port[MAX_NPORTS]; 371167514Skmacy device_t portdev[MAX_NPORTS]; 372237920Snp#ifdef TCP_OFFLOAD 373237920Snp void *tom_softc; 374237920Snp void *iwarp_softc; 375237920Snp#endif 376167514Skmacy char fw_version[64]; 377192540Sgnn char port_types[MAX_NPORTS + 1]; 378167514Skmacy uint32_t open_device_map; 379237920Snp#ifdef TCP_OFFLOAD 380237920Snp int offload_map; 381237920Snp#endif 382167514Skmacy struct mtx lock; 383169978Skmacy driver_intr_t *cxgb_intr; 384169978Skmacy int msi_count; 385170869Skmacy 386170869Skmacy#define ADAPTER_LOCK_NAME_LEN 32 387170869Skmacy char lockbuf[ADAPTER_LOCK_NAME_LEN]; 388170869Skmacy char reglockbuf[ADAPTER_LOCK_NAME_LEN]; 389170869Skmacy char mdiolockbuf[ADAPTER_LOCK_NAME_LEN]; 390170869Skmacy char elmerlockbuf[ADAPTER_LOCK_NAME_LEN]; 391209116Snp 392209116Snp int timestamp; 393237920Snp 394237920Snp#ifdef TCP_OFFLOAD 395237920Snp#define NUM_CPL_HANDLERS 0xa7 396237920Snp cpl_handler_t cpl_handler[NUM_CPL_HANDLERS] __aligned(CACHE_LINE_SIZE); 397237920Snp#endif 398167514Skmacy}; 399167514Skmacy 400167514Skmacystruct t3_rx_mode { 401167514Skmacy 402167514Skmacy uint32_t idx; 403167514Skmacy struct port_info *port; 404167514Skmacy}; 405167514Skmacy 406167514Skmacy#define MDIO_LOCK(adapter) mtx_lock(&(adapter)->mdio_lock) 407167514Skmacy#define MDIO_UNLOCK(adapter) mtx_unlock(&(adapter)->mdio_lock) 408170654Skmacy#define ELMR_LOCK(adapter) mtx_lock(&(adapter)->elmer_lock) 409170654Skmacy#define ELMR_UNLOCK(adapter) mtx_unlock(&(adapter)->elmer_lock) 410167514Skmacy 411167514Skmacy 412170869Skmacy#define PORT_LOCK(port) mtx_lock(&(port)->lock); 413170869Skmacy#define PORT_UNLOCK(port) mtx_unlock(&(port)->lock); 414170869Skmacy#define PORT_LOCK_INIT(port, name) mtx_init(&(port)->lock, name, 0, MTX_DEF) 415170869Skmacy#define PORT_LOCK_DEINIT(port) mtx_destroy(&(port)->lock) 416194521Skmacy#define PORT_LOCK_ASSERT_NOTOWNED(port) mtx_assert(&(port)->lock, MA_NOTOWNED) 417170869Skmacy#define PORT_LOCK_ASSERT_OWNED(port) mtx_assert(&(port)->lock, MA_OWNED) 418170869Skmacy 419167514Skmacy#define ADAPTER_LOCK(adap) mtx_lock(&(adap)->lock); 420167514Skmacy#define ADAPTER_UNLOCK(adap) mtx_unlock(&(adap)->lock); 421170869Skmacy#define ADAPTER_LOCK_INIT(adap, name) mtx_init(&(adap)->lock, name, 0, MTX_DEF) 422170869Skmacy#define ADAPTER_LOCK_DEINIT(adap) mtx_destroy(&(adap)->lock) 423192540Sgnn#define ADAPTER_LOCK_ASSERT_NOTOWNED(adap) mtx_assert(&(adap)->lock, MA_NOTOWNED) 424192540Sgnn#define ADAPTER_LOCK_ASSERT_OWNED(adap) mtx_assert(&(adap)->lock, MA_OWNED) 425167514Skmacy 426167514Skmacy 427167514Skmacystatic __inline uint32_t 428167514Skmacyt3_read_reg(adapter_t *adapter, uint32_t reg_addr) 429167514Skmacy{ 430167514Skmacy return (bus_space_read_4(adapter->bt, adapter->bh, reg_addr)); 431167514Skmacy} 432167514Skmacy 433167514Skmacystatic __inline void 434167514Skmacyt3_write_reg(adapter_t *adapter, uint32_t reg_addr, uint32_t val) 435167514Skmacy{ 436167514Skmacy bus_space_write_4(adapter->bt, adapter->bh, reg_addr, val); 437167514Skmacy} 438167514Skmacy 439167514Skmacystatic __inline void 440167514Skmacyt3_os_pci_read_config_4(adapter_t *adapter, int reg, uint32_t *val) 441167514Skmacy{ 442167514Skmacy *val = pci_read_config(adapter->dev, reg, 4); 443167514Skmacy} 444167514Skmacy 445167514Skmacystatic __inline void 446167514Skmacyt3_os_pci_write_config_4(adapter_t *adapter, int reg, uint32_t val) 447167514Skmacy{ 448167514Skmacy pci_write_config(adapter->dev, reg, val, 4); 449167514Skmacy} 450167514Skmacy 451167514Skmacystatic __inline void 452167514Skmacyt3_os_pci_read_config_2(adapter_t *adapter, int reg, uint16_t *val) 453167514Skmacy{ 454167514Skmacy *val = pci_read_config(adapter->dev, reg, 2); 455167514Skmacy} 456167514Skmacy 457167514Skmacystatic __inline void 458167514Skmacyt3_os_pci_write_config_2(adapter_t *adapter, int reg, uint16_t val) 459167514Skmacy{ 460167514Skmacy pci_write_config(adapter->dev, reg, val, 2); 461167514Skmacy} 462167514Skmacy 463167514Skmacystatic __inline uint8_t * 464167514Skmacyt3_get_next_mcaddr(struct t3_rx_mode *rm) 465167514Skmacy{ 466167514Skmacy uint8_t *macaddr = NULL; 467176472Skmacy struct ifnet *ifp = rm->port->ifp; 468176472Skmacy struct ifmultiaddr *ifma; 469176472Skmacy int i = 0; 470176472Skmacy 471195071Srwatson if_maddr_rlock(ifp); 472176472Skmacy TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { 473176472Skmacy if (ifma->ifma_addr->sa_family != AF_LINK) 474176472Skmacy continue; 475176472Skmacy if (i == rm->idx) { 476176472Skmacy macaddr = LLADDR((struct sockaddr_dl *)ifma->ifma_addr); 477176472Skmacy break; 478176472Skmacy } 479176472Skmacy i++; 480176472Skmacy } 481195071Srwatson if_maddr_runlock(ifp); 482167514Skmacy 483167514Skmacy rm->idx++; 484167514Skmacy return (macaddr); 485167514Skmacy} 486167514Skmacy 487167514Skmacystatic __inline void 488167514Skmacyt3_init_rx_mode(struct t3_rx_mode *rm, struct port_info *port) 489167514Skmacy{ 490167514Skmacy rm->idx = 0; 491167514Skmacy rm->port = port; 492167514Skmacy} 493167514Skmacy 494167514Skmacystatic __inline struct port_info * 495167514Skmacyadap2pinfo(struct adapter *adap, int idx) 496167514Skmacy{ 497167514Skmacy return &adap->port[idx]; 498167514Skmacy} 499167514Skmacy 500167514Skmacyint t3_os_find_pci_capability(adapter_t *adapter, int cap); 501167514Skmacyint t3_os_pci_save_state(struct adapter *adapter); 502167514Skmacyint t3_os_pci_restore_state(struct adapter *adapter); 503209841Snpvoid t3_os_link_intr(struct port_info *); 504167514Skmacyvoid t3_os_link_changed(adapter_t *adapter, int port_id, int link_status, 505197791Snp int speed, int duplex, int fc, int mac_was_reset); 506181614Skmacyvoid t3_os_phymod_changed(struct adapter *adap, int port_id); 507167514Skmacyvoid t3_sge_err_intr_handler(adapter_t *adapter); 508237920Snp#ifdef TCP_OFFLOAD 509237920Snpint t3_offload_tx(struct adapter *, struct mbuf *); 510237920Snp#endif 511167514Skmacyvoid t3_os_set_hw_addr(adapter_t *adapter, int port_idx, u8 hw_addr[]); 512167514Skmacyint t3_mgmt_tx(adapter_t *adap, struct mbuf *m); 513237920Snpint t3_register_cpl_handler(struct adapter *, int, cpl_handler_t); 514167514Skmacy 515167514Skmacyint t3_sge_alloc(struct adapter *); 516167514Skmacyint t3_sge_free(struct adapter *); 517167514Skmacyint t3_sge_alloc_qset(adapter_t *, uint32_t, int, int, const struct qset_params *, 518167514Skmacy int, struct port_info *); 519219946Snpvoid t3_free_sge_resources(adapter_t *, int); 520167514Skmacyvoid t3_sge_start(adapter_t *); 521169978Skmacyvoid t3_sge_stop(adapter_t *); 522167514Skmacyvoid t3b_intr(void *data); 523167514Skmacyvoid t3_intr_msi(void *data); 524167514Skmacyvoid t3_intr_msix(void *data); 525167514Skmacy 526170654Skmacyint t3_sge_init_adapter(adapter_t *); 527175224Skmacyint t3_sge_reset_adapter(adapter_t *); 528170654Skmacyint t3_sge_init_port(struct port_info *); 529194521Skmacyvoid t3_free_tx_desc(struct sge_qset *qs, int n, int qid); 530167514Skmacy 531237925Snpvoid t3_rx_eth(struct adapter *adap, struct mbuf *m, int ethpad); 532167514Skmacy 533174708Skmacyvoid t3_add_attach_sysctls(adapter_t *sc); 534174708Skmacyvoid t3_add_configured_sysctls(adapter_t *sc); 535167514Skmacyint t3_get_desc(const struct sge_qset *qs, unsigned int qnum, unsigned int idx, 536167514Skmacy unsigned char *data); 537167514Skmacyvoid t3_update_qset_coalesce(struct sge_qset *qs, const struct qset_params *p); 538181652Skmacy 539167514Skmacy/* 540167514Skmacy * XXX figure out how we can return this to being private to sge 541167514Skmacy */ 542167760Skmacy#define desc_reclaimable(q) ((int)((q)->processed - (q)->cleaned - TX_MAX_DESC)) 543167514Skmacy 544174708Skmacy#define container_of(p, stype, field) ((stype *)(((uint8_t *)(p)) - offsetof(stype, field))) 545167514Skmacy 546167514Skmacystatic __inline struct sge_qset * 547167514Skmacyfl_to_qset(struct sge_fl *q, int qidx) 548167514Skmacy{ 549167514Skmacy return container_of(q, struct sge_qset, fl[qidx]); 550167514Skmacy} 551167514Skmacy 552167514Skmacystatic __inline struct sge_qset * 553167514Skmacyrspq_to_qset(struct sge_rspq *q) 554167514Skmacy{ 555167514Skmacy return container_of(q, struct sge_qset, rspq); 556167514Skmacy} 557167514Skmacy 558167514Skmacystatic __inline struct sge_qset * 559167514Skmacytxq_to_qset(struct sge_txq *q, int qidx) 560167514Skmacy{ 561167514Skmacy return container_of(q, struct sge_qset, txq[qidx]); 562167514Skmacy} 563167514Skmacy 564167514Skmacy#undef container_of 565167514Skmacy 566237920Snp#define OFFLOAD_DEVMAP_BIT (1 << MAX_NPORTS) 567169978Skmacystatic inline int offload_running(adapter_t *adapter) 568169978Skmacy{ 569169978Skmacy return isset(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT); 570169978Skmacy} 571169978Skmacy 572194521Skmacyvoid cxgb_tx_watchdog(void *arg); 573194521Skmacyint cxgb_transmit(struct ifnet *ifp, struct mbuf *m); 574194521Skmacyvoid cxgb_qflush(struct ifnet *ifp); 575237920Snpvoid t3_iterate(void (*)(struct adapter *, void *), void *); 576167514Skmacy#endif 577