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