Home | History | Annotate | Line # | Download | only in cxgb
      1  1.1     jklos /**************************************************************************
      2  1.1     jklos 
      3  1.1     jklos Copyright (c) 2007, Chelsio Inc.
      4  1.1     jklos All rights reserved.
      5  1.1     jklos 
      6  1.1     jklos Redistribution and use in source and binary forms, with or without
      7  1.1     jklos modification, are permitted provided that the following conditions are met:
      8  1.1     jklos 
      9  1.1     jklos  1. Redistributions of source code must retain the above copyright notice,
     10  1.1     jklos     this list of conditions and the following disclaimer.
     11  1.1     jklos 
     12  1.1     jklos  2. Neither the name of the Chelsio Corporation nor the names of its
     13  1.1     jklos     contributors may be used to endorse or promote products derived from
     14  1.1     jklos     this software without specific prior written permission.
     15  1.1     jklos 
     16  1.1     jklos THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     17  1.1     jklos AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     18  1.1     jklos IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     19  1.1     jklos ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
     20  1.1     jklos LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     21  1.1     jklos CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     22  1.1     jklos SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     23  1.1     jklos INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     24  1.1     jklos CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     25  1.1     jklos ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     26  1.1     jklos POSSIBILITY OF SUCH DAMAGE.
     27  1.1     jklos 
     28  1.1     jklos 
     29  1.1     jklos ***************************************************************************/
     30  1.1     jklos 
     31  1.1     jklos 
     32  1.1     jklos 
     33  1.1     jklos #ifndef _CXGB_ADAPTER_H_
     34  1.1     jklos #define _CXGB_ADAPTER_H_
     35  1.1     jklos 
     36  1.1     jklos #include <sys/lock.h>
     37  1.1     jklos #include <sys/mutex.h>
     38  1.1     jklos #include <sys/mbuf.h>
     39  1.1     jklos #include <sys/socket.h>
     40  1.1     jklos #include <sys/sockio.h>
     41  1.1     jklos 
     42  1.1     jklos #include <net/if.h>
     43  1.1     jklos #include <net/if_ether.h>
     44  1.1     jklos #include <net/if_media.h>
     45  1.1     jklos 
     46  1.2    dyoung #include <sys/bus.h>
     47  1.1     jklos #include <dev/pci/pcireg.h>
     48  1.1     jklos #include <dev/pci/pcivar.h>
     49  1.1     jklos 
     50  1.1     jklos #ifdef CONFIG_DEFINED
     51  1.1     jklos #include <cxgb_osdep.h>
     52  1.1     jklos #include <ulp/toecore/toedev.h>
     53  1.1     jklos #include <sys/mbufq.h>
     54  1.1     jklos #else
     55  1.1     jklos #include "cxgb_osdep.h"
     56  1.1     jklos #include "cxgb_mbuf.h"
     57  1.1     jklos #include "cxgb_toedev.h"
     58  1.1     jklos #endif
     59  1.1     jklos 
     60  1.1     jklos struct adapter;
     61  1.1     jklos struct sge_qset;
     62  1.1     jklos extern int cxgb_debug;
     63  1.1     jklos 
     64  1.1     jklos #ifdef DEBUG_LOCKING
     65  1.1     jklos #define MTX_INIT(lock, lockname, class, flags) \
     66  1.1     jklos     do { \
     67  1.1     jklos         printf("initializing %s at %s:%d\n", lockname, __FILE__, __LINE__); \
     68  1.1     jklos         mtx_init((lock), lockname, class, flags);       \
     69  1.1     jklos     } while (0)
     70  1.1     jklos 
     71  1.1     jklos #define MTX_DESTROY(lock) \
     72  1.1     jklos     do { \
     73  1.1     jklos         printf("destroying %s at %s:%d\n", (lock)->lock_object.lo_name, __FILE__, __LINE__); \
     74  1.1     jklos         mtx_destroy((lock));                    \
     75  1.1     jklos     } while (0)
     76  1.1     jklos 
     77  1.1     jklos #define SX_INIT(lock, lockname) \
     78  1.1     jklos     do { \
     79  1.1     jklos         printf("initializing %s at %s:%d\n", lockname, __FILE__, __LINE__); \
     80  1.1     jklos         sx_init((lock), lockname);      \
     81  1.1     jklos     } while (0)
     82  1.1     jklos 
     83  1.1     jklos #define SX_DESTROY(lock) \
     84  1.1     jklos     do { \
     85  1.1     jklos         printf("destroying %s at %s:%d\n", (lock)->lock_object.lo_name, __FILE__, __LINE__); \
     86  1.1     jklos         sx_destroy((lock));                 \
     87  1.1     jklos     } while (0)
     88  1.1     jklos #else
     89  1.1     jklos #define MTX_INIT mtx_init
     90  1.1     jklos #define MTX_DESTROY mtx_destroy
     91  1.1     jklos #define SX_INIT sx_init
     92  1.1     jklos #define SX_DESTROY sx_destroy
     93  1.1     jklos #endif
     94  1.1     jklos 
     95  1.1     jklos struct port_device {
     96  1.1     jklos 	device_t	dev;
     97  1.1     jklos 	struct adapter	*parent;
     98  1.1     jklos 	int		port_number;
     99  1.1     jklos };
    100  1.1     jklos 
    101  1.1     jklos struct port_info {
    102  1.1     jklos     struct adapter  *adapter;
    103  1.1     jklos     struct ifnet    *ifp;
    104  1.1     jklos     struct port_device *pd;
    105  1.1     jklos     int     port;
    106  1.5   msaitoh     u_short     if_flags;
    107  1.1     jklos     const struct port_type_info *port_type;
    108  1.1     jklos     struct cphy phy;
    109  1.1     jklos     struct cmac mac;
    110  1.1     jklos     struct link_config link_config;
    111  1.1     jklos     struct ifmedia  media;
    112  1.1     jklos #ifdef USE_SX
    113  1.1     jklos     struct sx   lock;
    114  1.1     jklos #else
    115  1.1     jklos     struct mtx  lock;
    116  1.1     jklos #endif
    117  1.1     jklos     uint8_t     port_id;
    118  1.1     jklos     uint8_t     tx_chan;
    119  1.1     jklos     uint8_t     txpkt_intf;
    120  1.1     jklos     uint8_t     nqsets;
    121  1.1     jklos     uint8_t         first_qset;
    122  1.1     jklos 
    123  1.1     jklos     uint8_t     hw_addr[ETHER_ADDR_LEN];
    124  1.1     jklos     struct cxgb_task start_task;
    125  1.1     jklos     struct cxgb_task timer_reclaim_task;
    126  1.1     jklos     struct cdev     *port_cdev;
    127  1.1     jklos 
    128  1.1     jklos #define PORT_NAME_LEN 32
    129  1.1     jklos #define TASKQ_NAME_LEN 32
    130  1.1     jklos     char            lockbuf[PORT_NAME_LEN];
    131  1.1     jklos     char            taskqbuf[TASKQ_NAME_LEN];
    132  1.1     jklos };
    133  1.1     jklos 
    134  1.1     jklos enum {              /* adapter flags */
    135  1.1     jklos     FULL_INIT_DONE  = (1 << 0),
    136  1.1     jklos     USING_MSI   = (1 << 1),
    137  1.1     jklos     USING_MSIX  = (1 << 2),
    138  1.1     jklos     QUEUES_BOUND    = (1 << 3),
    139  1.1     jklos     FW_UPTODATE     = (1 << 4),
    140  1.1     jklos     TPS_UPTODATE    = (1 << 5),
    141  1.1     jklos };
    142  1.1     jklos 
    143  1.1     jklos 
    144  1.1     jklos #define FL_Q_SIZE   4096
    145  1.1     jklos #define JUMBO_Q_SIZE    512
    146  1.1     jklos #define RSPQ_Q_SIZE 1024
    147  1.1     jklos #define TX_ETH_Q_SIZE   1024
    148  1.1     jklos 
    149  1.1     jklos 
    150  1.1     jklos 
    151  1.1     jklos /*
    152  1.1     jklos  * Types of Tx queues in each queue set.  Order here matters, do not change.
    153  1.1     jklos  * XXX TOE is not implemented yet, so the extra queues are just placeholders.
    154  1.1     jklos  */
    155  1.1     jklos enum { TXQ_ETH, TXQ_OFLD, TXQ_CTRL };
    156  1.1     jklos 
    157  1.1     jklos 
    158  1.1     jklos /* careful, the following are set on priv_flags and must not collide with
    159  1.1     jklos  * IFF_ flags!
    160  1.1     jklos  */
    161  1.1     jklos enum {
    162  1.1     jklos     LRO_ACTIVE = (1 << 8),
    163  1.1     jklos };
    164  1.1     jklos 
    165  1.1     jklos /* Max concurrent LRO sessions per queue set */
    166  1.1     jklos #define MAX_LRO_SES 8
    167  1.1     jklos 
    168  1.1     jklos struct t3_lro_session {
    169  1.1     jklos     struct mbuf *head;
    170  1.1     jklos     struct mbuf *tail;
    171  1.1     jklos     uint32_t seq;
    172  1.1     jklos     uint16_t ip_len;
    173  1.1     jklos     uint16_t mss;
    174  1.1     jklos     uint16_t vtag;
    175  1.1     jklos     uint8_t npkts;
    176  1.1     jklos };
    177  1.1     jklos 
    178  1.1     jklos struct lro_state {
    179  1.1     jklos     unsigned short enabled;
    180  1.1     jklos     unsigned short active_idx;
    181  1.1     jklos     unsigned int nactive;
    182  1.1     jklos     struct t3_lro_session sess[MAX_LRO_SES];
    183  1.1     jklos };
    184  1.1     jklos 
    185  1.1     jklos #define RX_BUNDLE_SIZE 8
    186  1.1     jklos 
    187  1.1     jklos struct rsp_desc;
    188  1.1     jklos 
    189  1.1     jklos struct sge_rspq {
    190  1.1     jklos     uint32_t    credits;
    191  1.1     jklos     uint32_t    size;
    192  1.1     jklos     uint32_t    cidx;
    193  1.1     jklos     uint32_t    gen;
    194  1.1     jklos     uint32_t    polling;
    195  1.1     jklos     uint32_t    holdoff_tmr;
    196  1.1     jklos     uint32_t    next_holdoff;
    197  1.1     jklos     uint32_t        imm_data;
    198  1.1     jklos     struct rsp_desc *desc;
    199  1.1     jklos     uint32_t    cntxt_id;
    200  1.1     jklos     struct mtx      lock;
    201  1.1     jklos     struct mbuf     *rx_head;    /* offload packet receive queue head */
    202  1.1     jklos     struct mbuf     *rx_tail;    /* offload packet receive queue tail */
    203  1.1     jklos 
    204  1.1     jklos     uint32_t        offload_pkts;
    205  1.1     jklos     uint32_t        offload_bundles;
    206  1.1     jklos     uint32_t        pure_rsps;
    207  1.1     jklos     uint32_t        unhandled_irqs;
    208  1.1     jklos 
    209  1.1     jklos     bus_addr_t  phys_addr;
    210  1.1     jklos     bus_dma_tag_t   desc_tag;
    211  1.1     jklos     bus_dmamap_t    desc_map;
    212  1.1     jklos 
    213  1.1     jklos     struct t3_mbuf_hdr rspq_mh;
    214  1.1     jklos #define RSPQ_NAME_LEN  32
    215  1.1     jklos     char            lockbuf[RSPQ_NAME_LEN];
    216  1.1     jklos 
    217  1.1     jklos };
    218  1.1     jklos 
    219  1.1     jklos #ifndef DISABLE_MBUF_IOVEC
    220  1.1     jklos #define rspq_mbuf rspq_mh.mh_head
    221  1.1     jklos #endif
    222  1.1     jklos 
    223  1.1     jklos struct rx_desc;
    224  1.1     jklos struct rx_sw_desc;
    225  1.1     jklos 
    226  1.1     jklos struct sge_fl {
    227  1.1     jklos     uint32_t    buf_size;
    228  1.1     jklos     uint32_t    credits;
    229  1.1     jklos     uint32_t    size;
    230  1.1     jklos     uint32_t    cidx;
    231  1.1     jklos     uint32_t    pidx;
    232  1.1     jklos     uint32_t    gen;
    233  1.1     jklos     struct rx_desc  *desc;
    234  1.1     jklos     struct rx_sw_desc *sdesc;
    235  1.1     jklos     bus_addr_t  phys_addr;
    236  1.1     jklos     uint32_t    cntxt_id;
    237  1.1     jklos     uint64_t    empty;
    238  1.1     jklos     bus_dma_tag_t   desc_tag;
    239  1.1     jklos     bus_dmamap_t    desc_map;
    240  1.1     jklos     bus_dma_tag_t   entry_tag;
    241  1.1     jklos     int             type;
    242  1.1     jklos };
    243  1.1     jklos 
    244  1.1     jklos struct tx_desc;
    245  1.1     jklos struct tx_sw_desc;
    246  1.1     jklos 
    247  1.1     jklos #define TXQ_TRANSMITTING    0x1
    248  1.1     jklos 
    249  1.1     jklos struct sge_txq {
    250  1.1     jklos     uint64_t    flags;
    251  1.1     jklos     uint32_t    in_use;
    252  1.1     jklos     uint32_t    size;
    253  1.1     jklos     uint32_t    processed;
    254  1.1     jklos     uint32_t    cleaned;
    255  1.1     jklos     uint32_t    stop_thres;
    256  1.1     jklos     uint32_t    cidx;
    257  1.1     jklos     uint32_t    pidx;
    258  1.1     jklos     uint32_t    gen;
    259  1.1     jklos     uint32_t    unacked;
    260  1.1     jklos     struct tx_desc  *desc;
    261  1.1     jklos     struct tx_sw_desc *sdesc;
    262  1.1     jklos     uint32_t    token;
    263  1.1     jklos     bus_addr_t  phys_addr;
    264  1.1     jklos     struct cxgb_task qresume_task;
    265  1.1     jklos     struct cxgb_task qreclaim_task;
    266  1.1     jklos     struct port_info *port;
    267  1.1     jklos     uint32_t    cntxt_id;
    268  1.1     jklos     uint64_t    stops;
    269  1.1     jklos     uint64_t    restarts;
    270  1.1     jklos     bus_dma_tag_t   desc_tag;
    271  1.1     jklos     bus_dmamap_t    desc_map;
    272  1.1     jklos     bus_dma_tag_t   entry_tag;
    273  1.1     jklos     struct mbuf_head sendq;
    274  1.1     jklos     struct mtx      lock;
    275  1.1     jklos #define TXQ_NAME_LEN  32
    276  1.1     jklos     char            lockbuf[TXQ_NAME_LEN];
    277  1.1     jklos };
    278  1.1     jklos 
    279  1.1     jklos 
    280  1.1     jklos enum {
    281  1.1     jklos     SGE_PSTAT_TSO,              /* # of TSO requests */
    282  1.1     jklos     SGE_PSTAT_RX_CSUM_GOOD,     /* # of successful RX csum offloads */
    283  1.1     jklos     SGE_PSTAT_TX_CSUM,          /* # of TX checksum offloads */
    284  1.1     jklos     SGE_PSTAT_VLANEX,           /* # of VLAN tag extractions */
    285  1.1     jklos     SGE_PSTAT_VLANINS,          /* # of VLAN tag insertions */
    286  1.1     jklos     SGE_PSTATS_LRO_QUEUED,      /* # of LRO appended packets */
    287  1.1     jklos     SGE_PSTATS_LRO_FLUSHED,     /* # of LRO flushed packets */
    288  1.1     jklos     SGE_PSTATS_LRO_X_STREAMS,   /* # of exceeded LRO contexts */
    289  1.1     jklos };
    290  1.1     jklos 
    291  1.1     jklos #define SGE_PSTAT_MAX (SGE_PSTATS_LRO_X_STREAMS+1)
    292  1.1     jklos 
    293  1.1     jklos struct sge_qset {
    294  1.1     jklos     struct sge_rspq     rspq;
    295  1.1     jklos     struct sge_fl       fl[SGE_RXQ_PER_SET];
    296  1.1     jklos     struct lro_state        lro;
    297  1.1     jklos     struct sge_txq      txq[SGE_TXQ_PER_SET];
    298  1.1     jklos     uint32_t                txq_stopped;       /* which Tx queues are stopped */
    299  1.1     jklos     uint64_t                port_stats[SGE_PSTAT_MAX];
    300  1.1     jklos     struct port_info        *port;
    301  1.1     jklos     int                     idx; /* qset # */
    302  1.1     jklos };
    303  1.1     jklos 
    304  1.1     jklos struct sge {
    305  1.1     jklos     struct sge_qset         qs[SGE_QSETS];
    306  1.1     jklos     struct mtx              reg_lock;
    307  1.1     jklos };
    308  1.1     jklos 
    309  1.1     jklos struct filter_info;
    310  1.1     jklos 
    311  1.1     jklos struct adapter {
    312  1.1     jklos     device_t        dev; // so we have a compatible pointer
    313  1.1     jklos     int         flags;
    314  1.1     jklos     TAILQ_ENTRY(adapter)    adapter_entry;
    315  1.1     jklos 
    316  1.1     jklos     /* PCI register resources */
    317  1.1     jklos     int         regs_rid;
    318  1.1     jklos     struct resource     *regs_res;
    319  1.1     jklos     bus_space_handle_t  bh;
    320  1.1     jklos     bus_space_tag_t     bt;
    321  1.1     jklos     bus_size_t              mmio_len;
    322  1.1     jklos     uint32_t                link_width;
    323  1.1     jklos     struct pci_attach_args pa;
    324  1.1     jklos     uint32_t            bar0;
    325  1.1     jklos     bus_space_handle_t  bar0_handle;
    326  1.1     jklos     pci_intr_handle_t   intr_handle;
    327  1.1     jklos     void               *intr_cookie;
    328  1.1     jklos 
    329  1.1     jklos     /* DMA resources */
    330  1.1     jklos     bus_dma_tag_t       parent_dmat;
    331  1.1     jklos     bus_dma_tag_t       rx_dmat;
    332  1.1     jklos     bus_dma_tag_t       rx_jumbo_dmat;
    333  1.1     jklos     bus_dma_tag_t       tx_dmat;
    334  1.1     jklos 
    335  1.1     jklos     /* Interrupt resources */
    336  1.1     jklos     int         irq_rid;
    337  1.1     jklos 
    338  1.1     jklos     uint32_t        msix_regs_rid;
    339  1.1     jklos     struct resource     *msix_regs_res;
    340  1.1     jklos 
    341  1.1     jklos     struct resource     *msix_irq_res[SGE_QSETS];
    342  1.1     jklos     int         msix_irq_rid[SGE_QSETS];
    343  1.1     jklos     void            *msix_intr_tag[SGE_QSETS];
    344  1.1     jklos     uint8_t                 rxpkt_map[8]; /* maps RX_PKT interface values to port ids */
    345  1.1     jklos     uint8_t                 rrss_map[SGE_QSETS]; /* revers RSS map table */
    346  1.1     jklos 
    347  1.1     jklos     struct filter_info      *filters;
    348  1.1     jklos 
    349  1.1     jklos     /* Tasks */
    350  1.1     jklos     struct cxgb_task    ext_intr_task;
    351  1.1     jklos     struct cxgb_task    slow_intr_task;
    352  1.1     jklos     struct cxgb_task    tick_task;
    353  1.1     jklos     struct callout      cxgb_tick_ch;
    354  1.1     jklos     struct callout      sge_timer_ch;
    355  1.1     jklos 
    356  1.1     jklos     /* Register lock for use by the hardware layer */
    357  1.1     jklos     struct mtx      mdio_lock;
    358  1.1     jklos     struct mtx      elmer_lock;
    359  1.1     jklos 
    360  1.1     jklos     /* Bookkeeping for the hardware layer */
    361  1.1     jklos     struct adapter_params  params;
    362  1.1     jklos     unsigned int slow_intr_mask;
    363  1.1     jklos     unsigned long irq_stats[IRQ_NUM_STATS];
    364  1.1     jklos 
    365  1.1     jklos     struct sge              sge;
    366  1.1     jklos     struct mc7              pmrx;
    367  1.1     jklos     struct mc7              pmtx;
    368  1.1     jklos     struct mc7              cm;
    369  1.1     jklos     struct mc5              mc5;
    370  1.1     jklos 
    371  1.1     jklos     struct port_info    port[MAX_NPORTS];
    372  1.1     jklos     device_t        portdev[MAX_NPORTS];
    373  1.1     jklos     struct toedev           tdev;
    374  1.1     jklos     char                    fw_version[64];
    375  1.1     jklos     uint32_t                open_device_map;
    376  1.1     jklos     uint32_t                registered_device_map;
    377  1.1     jklos #ifdef USE_SX
    378  1.1     jklos     struct sx               lock;
    379  1.1     jklos #else
    380  1.1     jklos     struct mtx              lock;
    381  1.1     jklos #endif
    382  1.1     jklos     int                     (*cxgb_intr)(void *);
    383  1.1     jklos     int                     msi_count;
    384  1.1     jklos 
    385  1.1     jklos #define ADAPTER_LOCK_NAME_LEN   32
    386  1.1     jklos     char                    lockbuf[ADAPTER_LOCK_NAME_LEN];
    387  1.1     jklos     char                    reglockbuf[ADAPTER_LOCK_NAME_LEN];
    388  1.1     jklos     char                    mdiolockbuf[ADAPTER_LOCK_NAME_LEN];
    389  1.1     jklos     char                    elmerlockbuf[ADAPTER_LOCK_NAME_LEN];
    390  1.1     jklos };
    391  1.1     jklos 
    392  1.1     jklos struct t3_rx_mode {
    393  1.1     jklos 
    394  1.1     jklos     uint32_t                idx;
    395  1.1     jklos     struct port_info        *port;
    396  1.1     jklos };
    397  1.1     jklos 
    398  1.1     jklos 
    399  1.1     jklos #define MDIO_LOCK(adapter)  mtx_lock(&(adapter)->mdio_lock)
    400  1.1     jklos #define MDIO_UNLOCK(adapter)    mtx_unlock(&(adapter)->mdio_lock)
    401  1.1     jklos #define ELMR_LOCK(adapter)  mtx_lock(&(adapter)->elmer_lock)
    402  1.1     jklos #define ELMR_UNLOCK(adapter)    mtx_unlock(&(adapter)->elmer_lock)
    403  1.1     jklos 
    404  1.1     jklos 
    405  1.1     jklos #ifdef USE_SX
    406  1.1     jklos #define PORT_LOCK(port)          sx_xlock(&(port)->lock);
    407  1.1     jklos #define PORT_UNLOCK(port)        sx_xunlock(&(port)->lock);
    408  1.1     jklos #define PORT_LOCK_INIT(port, name)   SX_INIT(&(port)->lock, name)
    409  1.1     jklos #define PORT_LOCK_DEINIT(port)       SX_DESTROY(&(port)->lock)
    410  1.1     jklos #define PORT_LOCK_ASSERT_OWNED(port) sx_assert(&(port)->lock, SA_LOCKED)
    411  1.1     jklos 
    412  1.1     jklos #define ADAPTER_LOCK(adap)             sx_xlock(&(adap)->lock);
    413  1.1     jklos #define ADAPTER_UNLOCK(adap)               sx_xunlock(&(adap)->lock);
    414  1.1     jklos #define ADAPTER_LOCK_INIT(adap, name)      SX_INIT(&(adap)->lock, name)
    415  1.1     jklos #define ADAPTER_LOCK_DEINIT(adap)          SX_DESTROY(&(adap)->lock)
    416  1.1     jklos #define ADAPTER_LOCK_ASSERT_NOTOWNED(adap) sx_assert(&(adap)->lock, SA_UNLOCKED)
    417  1.1     jklos #else
    418  1.1     jklos #define PORT_LOCK(port)          mtx_lock(&(port)->lock);
    419  1.1     jklos #define PORT_UNLOCK(port)        mtx_unlock(&(port)->lock);
    420  1.1     jklos #define PORT_LOCK_INIT(port, name)   mtx_init(&(port)->lock, name, 0, MTX_DEF)
    421  1.1     jklos #define PORT_LOCK_DEINIT(port)       mtx_destroy(&(port)->lock)
    422  1.1     jklos #define PORT_LOCK_ASSERT_OWNED(port) mtx_assert(&(port)->lock, MA_OWNED)
    423  1.1     jklos 
    424  1.1     jklos #define ADAPTER_LOCK(adap)  mtx_lock(&(adap)->lock);
    425  1.1     jklos #define ADAPTER_UNLOCK(adap)    mtx_unlock(&(adap)->lock);
    426  1.1     jklos #define ADAPTER_LOCK_INIT(adap, name) mtx_init(&(adap)->lock, name, 0, MTX_DEF)
    427  1.1     jklos #define ADAPTER_LOCK_DEINIT(adap) mtx_destroy(&(adap)->lock)
    428  1.1     jklos #define ADAPTER_LOCK_ASSERT_NOTOWNED(adap) mtx_assert(&(adap)->lock, MA_NOTOWNED)
    429  1.1     jklos #endif
    430  1.1     jklos 
    431  1.1     jklos 
    432  1.1     jklos static __inline uint32_t
    433  1.1     jklos t3_read_reg(adapter_t *adapter, uint32_t reg_addr)
    434  1.1     jklos {
    435  1.1     jklos     return (bus_space_read_4(adapter->bt, adapter->bh, reg_addr));
    436  1.1     jklos }
    437  1.1     jklos 
    438  1.1     jklos static __inline void
    439  1.1     jklos t3_write_reg(adapter_t *adapter, uint32_t reg_addr, uint32_t val)
    440  1.1     jklos {
    441  1.1     jklos     bus_space_write_4(adapter->bt, adapter->bh, reg_addr, val);
    442  1.1     jklos }
    443  1.1     jklos 
    444  1.1     jklos static __inline void
    445  1.1     jklos t3_os_pci_read_config_4(adapter_t *adapter, int reg, uint32_t *val)
    446  1.1     jklos {
    447  1.1     jklos     *val = pci_conf_read(adapter->pa.pa_pc, adapter->pa.pa_tag, reg);
    448  1.1     jklos }
    449  1.1     jklos 
    450  1.1     jklos static __inline void
    451  1.1     jklos t3_os_pci_write_config_4(adapter_t *adapter, int reg, uint32_t val)
    452  1.1     jklos {
    453  1.1     jklos     pci_conf_write(adapter->pa.pa_pc, adapter->pa.pa_tag, reg, val);
    454  1.1     jklos }
    455  1.1     jklos 
    456  1.1     jklos static __inline void
    457  1.1     jklos t3_os_pci_read_config_2(adapter_t *adapter, int reg, uint16_t *val)
    458  1.1     jklos {
    459  1.1     jklos     uint32_t temp;
    460  1.1     jklos     temp = pci_conf_read(adapter->pa.pa_pc, adapter->pa.pa_tag, reg&0xfc);
    461  1.1     jklos     if (reg&0x2)
    462  1.1     jklos         *val = (temp>>16)&0xffff;
    463  1.1     jklos     else
    464  1.1     jklos         *val = temp&0xffff;
    465  1.1     jklos }
    466  1.1     jklos 
    467  1.1     jklos static __inline void
    468  1.1     jklos t3_os_pci_write_config_2(adapter_t *adapter, int reg, uint16_t val)
    469  1.1     jklos {
    470  1.1     jklos     uint32_t temp = pci_conf_read(adapter->pa.pa_pc, adapter->pa.pa_tag, reg&0xfc);
    471  1.1     jklos     if (reg&0x2)
    472  1.1     jklos         temp = (temp&0xffff)|(val<<16);
    473  1.1     jklos     else
    474  1.1     jklos         temp = (temp&0xffff0000)|val;
    475  1.1     jklos     pci_conf_write(adapter->pa.pa_pc, adapter->pa.pa_tag, reg&0xfc, temp);
    476  1.1     jklos }
    477  1.1     jklos 
    478  1.1     jklos static __inline uint8_t *
    479  1.1     jklos t3_get_next_mcaddr(struct t3_rx_mode *rm)
    480  1.1     jklos {
    481  1.1     jklos     uint8_t *macaddr = NULL;
    482  1.1     jklos 
    483  1.1     jklos     if (rm->idx == 0)
    484  1.1     jklos         macaddr = rm->port->hw_addr;
    485  1.1     jklos 
    486  1.1     jklos     rm->idx++;
    487  1.1     jklos     return (macaddr);
    488  1.1     jklos }
    489  1.1     jklos 
    490  1.1     jklos static __inline void
    491  1.1     jklos t3_init_rx_mode(struct t3_rx_mode *rm, struct port_info *port)
    492  1.1     jklos {
    493  1.1     jklos     rm->idx = 0;
    494  1.1     jklos     rm->port = port;
    495  1.1     jklos }
    496  1.1     jklos 
    497  1.1     jklos static __inline struct port_info *
    498  1.1     jklos adap2pinfo(struct adapter *adap, int idx)
    499  1.1     jklos {
    500  1.1     jklos     return &adap->port[idx];
    501  1.1     jklos }
    502  1.1     jklos 
    503  1.1     jklos int t3_os_find_pci_capability(adapter_t *adapter, int cap);
    504  1.1     jklos int t3_os_pci_save_state(struct adapter *adapter);
    505  1.1     jklos int t3_os_pci_restore_state(struct adapter *adapter);
    506  1.1     jklos void t3_os_link_changed(adapter_t *adapter, int port_id, int link_status,
    507  1.1     jklos             int speed, int duplex, int fc);
    508  1.1     jklos void t3_sge_err_intr_handler(adapter_t *adapter);
    509  1.1     jklos int t3_offload_tx(struct toedev *, struct mbuf *);
    510  1.1     jklos void t3_os_ext_intr_handler(adapter_t *adapter);
    511  1.1     jklos void t3_os_set_hw_addr(adapter_t *adapter, int port_idx, u8 hw_addr[]);
    512  1.1     jklos int t3_mgmt_tx(adapter_t *adap, struct mbuf *m);
    513  1.1     jklos 
    514  1.1     jklos 
    515  1.1     jklos int t3_sge_alloc(struct adapter *);
    516  1.1     jklos int t3_sge_free(struct adapter *);
    517  1.1     jklos int t3_sge_alloc_qset(adapter_t *, uint32_t, int, int, const struct qset_params *,
    518  1.1     jklos     int, struct port_info *);
    519  1.1     jklos void t3_free_sge_resources(adapter_t *);
    520  1.1     jklos void t3_sge_start(adapter_t *);
    521  1.1     jklos void t3_sge_stop(adapter_t *);
    522  1.1     jklos int t3b_intr(void *data);
    523  1.1     jklos int t3_intr_msi(void *data);
    524  1.1     jklos int t3_intr_msix(void *data);
    525  1.1     jklos int t3_encap(struct port_info *, struct mbuf **, int *free);
    526  1.1     jklos 
    527  1.1     jklos int t3_sge_init_adapter(adapter_t *);
    528  1.1     jklos int t3_sge_init_port(struct port_info *);
    529  1.1     jklos void t3_sge_deinit_sw(adapter_t *);
    530  1.1     jklos 
    531  1.1     jklos void t3_rx_eth_lro(adapter_t *adap, struct sge_rspq *rq, struct mbuf *m,
    532  1.1     jklos     int ethpad, uint32_t rss_hash, uint32_t rss_csum, int lro);
    533  1.1     jklos void t3_rx_eth(struct adapter *adap, struct sge_rspq *rq, struct mbuf *m, int ethpad);
    534  1.1     jklos void t3_lro_flush(adapter_t *adap, struct sge_qset *qs, struct lro_state *state);
    535  1.1     jklos 
    536  1.1     jklos void t3_add_sysctls(adapter_t *sc);
    537  1.1     jklos int t3_get_desc(const struct sge_qset *qs, unsigned int qnum, unsigned int idx,
    538  1.1     jklos     unsigned char *data);
    539  1.1     jklos void t3_update_qset_coalesce(struct sge_qset *qs, const struct qset_params *p);
    540  1.1     jklos /*
    541  1.1     jklos  * XXX figure out how we can return this to being private to sge
    542  1.1     jklos  */
    543  1.1     jklos #define desc_reclaimable(q) ((int)((q)->processed - (q)->cleaned - TX_MAX_DESC))
    544  1.1     jklos 
    545  1.1     jklos #define container_of(p, stype, field) ((stype *)(((uint8_t *)(p)) - offsetof(stype, field)))
    546  1.1     jklos 
    547  1.1     jklos static __inline struct sge_qset *
    548  1.1     jklos fl_to_qset(struct sge_fl *q, int qidx)
    549  1.1     jklos {
    550  1.1     jklos     return container_of(q, struct sge_qset, fl[qidx]);
    551  1.1     jklos }
    552  1.1     jklos 
    553  1.1     jklos static __inline struct sge_qset *
    554  1.1     jklos rspq_to_qset(struct sge_rspq *q)
    555  1.1     jklos {
    556  1.1     jklos     return container_of(q, struct sge_qset, rspq);
    557  1.1     jklos }
    558  1.1     jklos 
    559  1.1     jklos static __inline struct sge_qset *
    560  1.1     jklos txq_to_qset(struct sge_txq *q, int qidx)
    561  1.1     jklos {
    562  1.1     jklos     return container_of(q, struct sge_qset, txq[qidx]);
    563  1.1     jklos }
    564  1.1     jklos 
    565  1.1     jklos static __inline struct adapter *
    566  1.1     jklos tdev2adap(struct toedev *d)
    567  1.1     jklos {
    568  1.1     jklos     return container_of(d, struct adapter, tdev);
    569  1.1     jklos }
    570  1.1     jklos 
    571  1.1     jklos #undef container_of
    572  1.1     jklos 
    573  1.1     jklos #define OFFLOAD_DEVMAP_BIT 15
    574  1.4  christos static __inline int offload_running(adapter_t *adapter)
    575  1.1     jklos {
    576  1.1     jklos         return isset(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT);
    577  1.1     jklos }
    578  1.1     jklos 
    579  1.1     jklos 
    580  1.1     jklos #endif
    581