The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/qlnx/qlnxe/qlnx_def.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * Copyright (c) 2017-2018 Cavium, Inc. 
    3  * All rights reserved.
    4  *
    5  *  Redistribution and use in source and binary forms, with or without
    6  *  modification, are permitted provided that the following conditions
    7  *  are met:
    8  *
    9  *  1. Redistributions of source code must retain the above copyright
   10  *     notice, this list of conditions and the following disclaimer.
   11  *  2. Redistributions in binary form must reproduce the above copyright
   12  *     notice, this list of conditions and the following disclaimer in the
   13  *     documentation and/or other materials provided with the distribution.
   14  *
   15  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
   16  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   17  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   18  *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
   19  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   20  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   21  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   22  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   23  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   24  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   25  *  POSSIBILITY OF SUCH DAMAGE.
   26  *
   27  * $FreeBSD$
   28  *
   29  */
   30 
   31 /*
   32  * File: qlnx_def.h
   33  * Author : David C Somayajulu, Cavium Inc., San Jose, CA 95131.
   34  */
   35 
   36 #ifndef _QLNX_DEF_H_
   37 #define _QLNX_DEF_H_
   38 
   39 #define VER_SIZE 16
   40 
   41 struct qlnx_ivec {
   42         uint32_t                rss_idx;
   43         void                    *ha;
   44         struct resource         *irq;
   45         void                    *handle;
   46         int                     irq_rid;
   47 };
   48 
   49 typedef struct qlnx_ivec qlnx_ivec_t;
   50 
   51 //#define QLNX_MAX_RSS          30
   52 #define QLNX_MAX_VF_RSS         4
   53 #define QLNX_MAX_RSS            36
   54 #define QLNX_DEFAULT_RSS        16
   55 #define QLNX_MAX_TC             1
   56 
   57 enum QLNX_STATE {
   58         QLNX_STATE_CLOSED,
   59         QLNX_STATE_OPEN,
   60 };
   61 
   62 #define HILO_U64(hi, lo)                ((((u64)(hi)) << 32) + (lo))
   63 
   64 #define MAX_NUM_TC      8
   65 #define MAX_NUM_PRI     8
   66 
   67 #ifndef BITS_PER_BYTE
   68 #define BITS_PER_BYTE   8
   69 #endif /* #ifndef BITS_PER_BYTE */
   70 
   71 /* 
   72  * RX ring buffer contains pointer to kmalloc() data only,
   73  */
   74 struct sw_rx_data {
   75         void            *data;
   76         bus_dmamap_t    map;
   77         dma_addr_t      dma_addr;
   78 };
   79 
   80 enum qlnx_agg_state {
   81         QLNX_AGG_STATE_NONE  = 0,
   82         QLNX_AGG_STATE_START = 1,
   83         QLNX_AGG_STATE_ERROR = 2
   84 };
   85 
   86 struct qlnx_agg_info {
   87         /* rx_buf is a data buffer that can be placed /consumed from rx bd
   88          * chain. It has two purposes: We will preallocate the data buffer
   89          * for each aggregation when we open the interface and will place this
   90          * buffer on the rx-bd-ring when we receive TPA_START. We don't want
   91          * to be in a state where allocation fails, as we can't reuse the
   92          * consumer buffer in the rx-chain since FW may still be writing to it
   93          * (since header needs to be modified for TPA.
   94          * The second purpose is to keep a pointer to the bd buffer during
   95          * aggregation.
   96          */
   97         struct sw_rx_data       rx_buf;
   98         enum qlnx_agg_state     agg_state;
   99         uint16_t                placement_offset;
  100         struct mbuf             *mpf; /* first mbuf in chain */
  101         struct mbuf             *mpl; /* last mbuf in chain */
  102 };
  103 
  104 #define RX_RING_SIZE_POW        13
  105 #define RX_RING_SIZE            (1 << RX_RING_SIZE_POW)
  106 
  107 #define TX_RING_SIZE_POW        14
  108 #define TX_RING_SIZE            (1 << TX_RING_SIZE_POW)
  109 
  110 struct qlnx_rx_queue {
  111         volatile __le16         *hw_cons_ptr;
  112         struct sw_rx_data       sw_rx_ring[RX_RING_SIZE];
  113         uint16_t                sw_rx_cons;
  114         uint16_t                sw_rx_prod;
  115         struct ecore_chain      rx_bd_ring;
  116         struct ecore_chain      rx_comp_ring;
  117         void __iomem            *hw_rxq_prod_addr;
  118         void                    *handle;
  119 
  120         /* LRO */
  121         struct qlnx_agg_info    tpa_info[ETH_TPA_MAX_AGGS_NUM];
  122 
  123         uint32_t                rx_buf_size;
  124 
  125         uint16_t                num_rx_buffers;
  126         uint16_t                rxq_id;
  127 
  128 #ifdef QLNX_SOFT_LRO
  129         struct lro_ctrl         lro;
  130 #endif
  131 };
  132 
  133 union db_prod {
  134         struct eth_db_data      data;
  135         uint32_t                raw;
  136 };
  137 
  138 struct sw_tx_bd {
  139         struct mbuf             *mp;
  140         bus_dmamap_t            map;
  141         uint8_t                 flags;
  142         int                     nsegs;
  143 
  144 /* Set on the first BD descriptor when there is a split BD */
  145 #define QLNX_TSO_SPLIT_BD               (1<<0)
  146 };
  147 
  148 #define QLNX_MAX_SEGMENTS               255
  149 struct qlnx_tx_queue {
  150         int                     index; /* Queue index */
  151         volatile __le16         *hw_cons_ptr;
  152         struct sw_tx_bd         sw_tx_ring[TX_RING_SIZE];
  153         uint16_t                sw_tx_cons;
  154         uint16_t                sw_tx_prod;
  155         struct ecore_chain      tx_pbl;
  156         void __iomem            *doorbell_addr;
  157         void                    *handle;
  158         union db_prod           tx_db;
  159 
  160         bus_dma_segment_t       segs[QLNX_MAX_SEGMENTS];
  161 
  162         uint16_t                num_tx_buffers;
  163 };
  164 
  165 #define BD_UNMAP_ADDR(bd)       HILO_U64(le32toh((bd)->addr.hi), \
  166                                         le32toh((bd)->addr.lo))
  167 #define BD_UNMAP_LEN(bd)        (le16toh((bd)->nbytes))
  168 
  169 #define BD_SET_UNMAP_ADDR_LEN(bd, maddr, len) \
  170         do { \
  171                 (bd)->addr.hi = htole32(U64_HI(maddr)); \
  172                 (bd)->addr.lo = htole32(U64_LO(maddr)); \
  173                 (bd)->nbytes = htole16(len); \
  174         } while (0);
  175 
  176 #define QLNX_FP_MAX_SEGS        24
  177 
  178 struct qlnx_fastpath {
  179         void                    *edev;
  180         uint8_t                 rss_id;
  181         struct ecore_sb_info    *sb_info;
  182         struct qlnx_rx_queue    *rxq;
  183         struct qlnx_tx_queue    *txq[MAX_NUM_TC];
  184         char                    name[64];
  185 
  186         struct mtx              tx_mtx;
  187         char                    tx_mtx_name[32];
  188         struct buf_ring         *tx_br;
  189         uint32_t                tx_ring_full;
  190 
  191         struct task             fp_task;
  192         struct taskqueue        *fp_taskqueue;
  193 
  194         /* transmit statistics */
  195         uint64_t                tx_pkts_processed;
  196         uint64_t                tx_pkts_freed;
  197         uint64_t                tx_pkts_transmitted;
  198         uint64_t                tx_pkts_completed;
  199         uint64_t                tx_tso_pkts;
  200         uint64_t                tx_non_tso_pkts;
  201 
  202 #ifdef QLNX_TRACE_PERF_DATA
  203         uint64_t                tx_pkts_trans_ctx;
  204         uint64_t                tx_pkts_compl_ctx;
  205         uint64_t                tx_pkts_trans_fp;
  206         uint64_t                tx_pkts_compl_fp;
  207         uint64_t                tx_pkts_compl_intr;
  208 #endif
  209 
  210         uint64_t                tx_lso_wnd_min_len;
  211         uint64_t                tx_defrag;
  212         uint64_t                tx_nsegs_gt_elem_left;
  213         uint32_t                tx_tso_max_nsegs;
  214         uint32_t                tx_tso_min_nsegs;
  215         uint32_t                tx_tso_max_pkt_len;
  216         uint32_t                tx_tso_min_pkt_len;
  217         uint64_t                tx_pkts[QLNX_FP_MAX_SEGS];
  218 
  219 #ifdef QLNX_TRACE_PERF_DATA
  220         uint64_t                tx_pkts_hist[QLNX_FP_MAX_SEGS];
  221         uint64_t                tx_comInt[QLNX_FP_MAX_SEGS];
  222         uint64_t                tx_pkts_q[QLNX_FP_MAX_SEGS];
  223 #endif
  224 
  225         uint64_t                err_tx_nsegs_gt_elem_left;
  226         uint64_t                err_tx_dmamap_create;
  227         uint64_t                err_tx_defrag_dmamap_load;
  228         uint64_t                err_tx_non_tso_max_seg;
  229         uint64_t                err_tx_dmamap_load;
  230         uint64_t                err_tx_defrag;
  231         uint64_t                err_tx_free_pkt_null;
  232         uint64_t                err_tx_cons_idx_conflict;
  233 
  234         uint64_t                lro_cnt_64;
  235         uint64_t                lro_cnt_128;
  236         uint64_t                lro_cnt_256;
  237         uint64_t                lro_cnt_512;
  238         uint64_t                lro_cnt_1024;
  239 
  240         /* receive statistics */
  241         uint64_t                rx_pkts;
  242         uint64_t                tpa_start;
  243         uint64_t                tpa_cont;
  244         uint64_t                tpa_end;
  245         uint64_t                err_m_getcl;
  246         uint64_t                err_m_getjcl;
  247         uint64_t                err_rx_hw_errors;
  248         uint64_t                err_rx_alloc_errors;
  249         uint64_t                err_rx_jumbo_chain_pkts;
  250         uint64_t                err_rx_mp_null;
  251         uint64_t                err_rx_tpa_invalid_agg_num;
  252 };
  253 
  254 struct qlnx_update_vport_params {
  255         uint8_t                 vport_id;
  256         uint8_t                 update_vport_active_rx_flg;
  257         uint8_t                 vport_active_rx_flg;
  258         uint8_t                 update_vport_active_tx_flg;
  259         uint8_t                 vport_active_tx_flg;
  260         uint8_t                 update_inner_vlan_removal_flg;
  261         uint8_t                 inner_vlan_removal_flg;
  262         struct ecore_rss_params *rss_params;
  263         struct ecore_sge_tpa_params *sge_tpa_params;
  264 };
  265 
  266 /*
  267  * link related
  268  */
  269 struct qlnx_link_output {
  270         bool            link_up;
  271         uint32_t        supported_caps;
  272         uint32_t        advertised_caps;
  273         uint32_t        link_partner_caps;
  274         uint32_t        speed; /* In Mb/s */
  275         bool            autoneg;
  276         uint32_t        media_type;
  277         uint32_t        duplex;
  278 };
  279 typedef struct qlnx_link_output qlnx_link_output_t;
  280 
  281 #define QLNX_LINK_DUPLEX                        0x0001
  282 
  283 #define QLNX_LINK_CAP_FIBRE                     0x0001
  284 #define QLNX_LINK_CAP_Autoneg                   0x0002
  285 #define QLNX_LINK_CAP_Pause                     0x0004
  286 #define QLNX_LINK_CAP_Asym_Pause                0x0008
  287 #define QLNX_LINK_CAP_1000baseT_Half            0x0010
  288 #define QLNX_LINK_CAP_1000baseT_Full            0x0020
  289 #define QLNX_LINK_CAP_10000baseKR_Full          0x0040
  290 #define QLNX_LINK_CAP_25000baseKR_Full          0x0080
  291 #define QLNX_LINK_CAP_40000baseLR4_Full         0x0100
  292 #define QLNX_LINK_CAP_50000baseKR2_Full         0x0200
  293 #define QLNX_LINK_CAP_100000baseKR4_Full        0x0400
  294 
  295 /* Functions definition */
  296 
  297 #define XMIT_PLAIN              0
  298 #define XMIT_L4_CSUM            (1 << 0)
  299 #define XMIT_LSO                (1 << 1)
  300 
  301 #define CQE_FLAGS_ERR   (PARSING_AND_ERR_FLAGS_IPHDRERROR_MASK <<       \
  302                          PARSING_AND_ERR_FLAGS_IPHDRERROR_SHIFT |       \
  303                          PARSING_AND_ERR_FLAGS_L4CHKSMERROR_MASK <<     \
  304                          PARSING_AND_ERR_FLAGS_L4CHKSMERROR_SHIFT |     \
  305                          PARSING_AND_ERR_FLAGS_TUNNELIPHDRERROR_MASK << \
  306                          PARSING_AND_ERR_FLAGS_TUNNELIPHDRERROR_SHIFT | \
  307                          PARSING_AND_ERR_FLAGS_TUNNELL4CHKSMERROR_MASK << \
  308                          PARSING_AND_ERR_FLAGS_TUNNELL4CHKSMERROR_SHIFT)
  309 
  310 #define RX_COPY_THRESH          92
  311 #define ETH_MAX_PACKET_SIZE     1500
  312 
  313 #define QLNX_MFW_VERSION_LENGTH 32
  314 #define QLNX_STORMFW_VERSION_LENGTH 32
  315 
  316 #define QLNX_TX_ELEM_RESERVE            2
  317 #define QLNX_TX_ELEM_THRESH             128
  318 #define QLNX_TX_ELEM_MAX_THRESH         512
  319 #define QLNX_TX_ELEM_MIN_THRESH         32
  320 #define QLNX_TX_COMPL_THRESH            32
  321 
  322 #define QLNX_TPA_MAX_AGG_BUFFERS             (20)
  323 
  324 #define QLNX_MAX_NUM_MULTICAST_ADDRS    ECORE_MAX_MC_ADDRS
  325 typedef struct _qlnx_mcast {
  326         uint16_t        rsrvd;
  327         uint8_t         addr[6];
  328 } __packed qlnx_mcast_t;
  329 
  330 typedef struct _qlnx_vf_attr {
  331         uint8_t         mac_addr[ETHER_ADDR_LEN];
  332         uint32_t        num_rings;
  333 } qlnx_vf_attr_t;
  334 
  335 typedef struct _qlnx_sriov_task {
  336         struct task             pf_task;
  337         struct taskqueue        *pf_taskqueue;
  338 
  339 #define QLNX_SRIOV_TASK_FLAGS_VF_PF_MSG         0x01
  340 #define QLNX_SRIOV_TASK_FLAGS_VF_FLR_UPDATE     0x02
  341 #define QLNX_SRIOV_TASK_FLAGS_BULLETIN_UPDATE   0x04
  342         volatile uint32_t       flags;
  343 
  344 } qlnx_sriov_task_t;
  345 
  346 /*
  347  * Adapter structure contains the hardware independent information of the
  348  * pci function.
  349  */
  350 struct qlnx_host {
  351         /* interface to ecore */
  352 
  353         struct ecore_dev        cdev;
  354 
  355         uint32_t                state;
  356 
  357         /* some flags */
  358         volatile struct {
  359                 volatile uint32_t
  360                         hw_init                 :1,
  361                         callout_init            :1,
  362                         slowpath_start          :1,
  363                         parent_tag              :1,
  364                         lock_init               :1;
  365         } flags;
  366 
  367         /* interface to o.s */
  368 
  369         device_t                pci_dev;
  370         uint8_t                 pci_func;
  371         uint8_t                 dev_unit;
  372         uint16_t                device_id;
  373 
  374         struct ifnet            *ifp;
  375         int                     if_flags;
  376         volatile int            link_up;
  377         struct ifmedia          media;
  378         uint16_t                max_frame_size;
  379 
  380         struct cdev             *ioctl_dev;
  381 
  382         /* resources */
  383         struct resource         *pci_reg;
  384         int                     reg_rid;
  385 
  386         struct resource         *pci_dbells;
  387         int                     dbells_rid;
  388         uint64_t                dbells_phys_addr;
  389         uint32_t                dbells_size;
  390 
  391         struct resource         *msix_bar;
  392         int                     msix_rid;
  393 
  394         int                     msix_count;
  395 
  396         struct mtx              hw_lock;
  397 
  398         /* debug */
  399 
  400         uint32_t                dbg_level;
  401         uint32_t                dbg_trace_lro_cnt;
  402         uint32_t                dbg_trace_tso_pkt_len;
  403         uint32_t                dp_level;
  404         uint32_t                dp_module;
  405 
  406         /* misc */
  407         uint8_t                 mfw_ver[QLNX_MFW_VERSION_LENGTH];
  408         uint8_t                 stormfw_ver[QLNX_STORMFW_VERSION_LENGTH];
  409         uint32_t                flash_size;
  410 
  411         /* dma related */
  412 
  413         bus_dma_tag_t           parent_tag;
  414         bus_dma_tag_t           tx_tag;
  415         bus_dma_tag_t           rx_tag;
  416 
  417         struct ecore_sb_info    sb_array[QLNX_MAX_RSS];
  418         struct qlnx_rx_queue    rxq_array[QLNX_MAX_RSS];
  419         struct qlnx_tx_queue    txq_array[(QLNX_MAX_RSS * MAX_NUM_TC)];
  420         struct qlnx_fastpath    fp_array[QLNX_MAX_RSS];
  421 
  422         /* tx related */
  423         struct callout          tx_callout;
  424         uint32_t                txr_idx;
  425 
  426         /* rx related */
  427         uint32_t                rx_pkt_threshold;
  428         uint32_t                rx_jumbo_buf_eq_mtu;
  429 
  430         /* slow path related */
  431         struct resource         *sp_irq[MAX_HWFNS_PER_DEVICE];
  432         void                    *sp_handle[MAX_HWFNS_PER_DEVICE];
  433         int                     sp_irq_rid[MAX_HWFNS_PER_DEVICE];
  434         struct task             sp_task[MAX_HWFNS_PER_DEVICE];
  435         struct taskqueue        *sp_taskqueue[MAX_HWFNS_PER_DEVICE];
  436 
  437         struct callout          qlnx_callout;
  438 
  439         /* fast path related */
  440         int                     num_rss;
  441         int                     num_tc;
  442 
  443 #define QLNX_MAX_TSS_CNT(ha)    ((ha->num_rss) * (ha->num_tc))
  444 
  445         qlnx_ivec_t              irq_vec[QLNX_MAX_RSS];
  446 
  447         uint8_t                 filter;
  448         uint32_t                nmcast;
  449         qlnx_mcast_t            mcast[QLNX_MAX_NUM_MULTICAST_ADDRS];
  450         struct ecore_filter_mcast ecore_mcast;
  451         uint8_t                 primary_mac[ETH_ALEN];
  452         uint8_t                 prio_to_tc[MAX_NUM_PRI];
  453         struct ecore_eth_stats  hw_stats;
  454         struct ecore_rss_params rss_params;
  455         uint32_t                rx_buf_size;
  456         bool                    rx_csum_offload;
  457 
  458         uint32_t                rx_coalesce_usecs;
  459         uint32_t                tx_coalesce_usecs;
  460 
  461         /* link related */
  462         qlnx_link_output_t      if_link;
  463 
  464         /* global counters */
  465         uint64_t                sp_interrupts;
  466         uint64_t                err_illegal_intr;
  467         uint64_t                err_fp_null;
  468         uint64_t                err_get_proto_invalid_type;
  469 
  470         /* error recovery related */
  471         uint32_t                error_recovery;
  472         struct task             err_task;
  473         struct taskqueue        *err_taskqueue;
  474 
  475         /* grcdump related */
  476         uint32_t                err_inject;
  477         uint32_t                grcdump_taken;
  478         uint32_t                grcdump_dwords[QLNX_MAX_HW_FUNCS];
  479         uint32_t                grcdump_size[QLNX_MAX_HW_FUNCS];
  480         void                    *grcdump[QLNX_MAX_HW_FUNCS];
  481 
  482         uint32_t                idle_chk_taken;
  483         uint32_t                idle_chk_dwords[QLNX_MAX_HW_FUNCS];
  484         uint32_t                idle_chk_size[QLNX_MAX_HW_FUNCS];
  485         void                    *idle_chk[QLNX_MAX_HW_FUNCS];
  486 
  487         /* storm stats related */
  488 #define QLNX_STORM_STATS_TOTAL \
  489                 (QLNX_MAX_HW_FUNCS * QLNX_STORM_STATS_SAMPLES_PER_HWFN)
  490         qlnx_storm_stats_t      storm_stats[QLNX_STORM_STATS_TOTAL];
  491         uint32_t                storm_stats_index;
  492         uint32_t                storm_stats_enable;
  493         uint32_t                storm_stats_gather;
  494 
  495         uint32_t                personality;
  496 
  497         uint16_t                sriov_initialized;
  498         uint16_t                num_vfs;
  499         qlnx_vf_attr_t          *vf_attr;
  500         qlnx_sriov_task_t       sriov_task[MAX_HWFNS_PER_DEVICE];
  501         uint32_t                curr_vf;
  502 
  503         void                    *next;
  504         void                    *qlnx_rdma;
  505         volatile int            qlnxr_debug;
  506 };
  507 
  508 typedef struct qlnx_host qlnx_host_t;
  509 
  510 /* note that align has to be a power of 2 */
  511 #define QL_ALIGN(size, align) (((size) + ((align) - 1)) & (~((align) - 1)));
  512 #define QL_MIN(x, y) ((x < y) ? x : y)
  513 
  514 #define QL_RUNNING(ifp) \
  515                 ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) == \
  516                         IFF_DRV_RUNNING)
  517 
  518 #define QLNX_MAX_MTU                    9000
  519 #define QLNX_MAX_SEGMENTS_NON_TSO       (ETH_TX_MAX_BDS_PER_NON_LSO_PACKET - 1)
  520 //#define QLNX_MAX_TSO_FRAME_SIZE               ((64 * 1024 - 1) + 22)
  521 #define QLNX_MAX_TSO_FRAME_SIZE         65536
  522 #define QLNX_MAX_TX_MBUF_SIZE           65536    /* bytes - bd_len = 16bits */
  523 
  524 #define QL_MAC_CMP(mac1, mac2)    \
  525         ((((*(uint32_t *) mac1) == (*(uint32_t *) mac2) && \
  526         (*(uint16_t *)(mac1 + 4)) == (*(uint16_t *)(mac2 + 4)))) ? 0 : 1)
  527 #define for_each_rss(i) for (i = 0; i < ha->num_rss; i++)
  528 
  529 /*
  530  * Debug Related
  531  */
  532 
  533 #ifdef QLNX_DEBUG
  534 
  535 #define QL_DPRINT1(ha, x, ...)                                  \
  536         do {                                                    \
  537                 if ((ha)->dbg_level & 0x0001) {                 \
  538                         device_printf ((ha)->pci_dev,           \
  539                                 "[%s:%d]" x,                    \
  540                                 __func__, __LINE__,             \
  541                                 ## __VA_ARGS__);                \
  542                 }                                               \
  543         } while (0)
  544 
  545 #define QL_DPRINT2(ha, x, ...)                                  \
  546         do {                                                    \
  547                 if ((ha)->dbg_level & 0x0002) {                 \
  548                         device_printf ((ha)->pci_dev,           \
  549                                 "[%s:%d]" x,                    \
  550                                 __func__, __LINE__,             \
  551                                 ## __VA_ARGS__);                \
  552                 }                                               \
  553         } while (0)
  554 
  555 #define QL_DPRINT3(ha, x, ...)                                  \
  556         do {                                                    \
  557                 if ((ha)->dbg_level & 0x0004) {                 \
  558                         device_printf ((ha)->pci_dev,           \
  559                                 "[%s:%d]" x,                    \
  560                                 __func__, __LINE__,             \
  561                                 ## __VA_ARGS__);                \
  562                 }                                               \
  563         } while (0)
  564 
  565 #define QL_DPRINT4(ha, x, ...)                                  \
  566         do {                                                    \
  567                 if ((ha)->dbg_level & 0x0008) {                 \
  568                         device_printf ((ha)->pci_dev,           \
  569                                 "[%s:%d]" x,                    \
  570                                 __func__, __LINE__,             \
  571                                 ## __VA_ARGS__);                \
  572                 }                                               \
  573         } while (0)
  574 
  575 #define QL_DPRINT5(ha, x, ...)                                  \
  576         do {                                                    \
  577                 if ((ha)->dbg_level & 0x0010) {                 \
  578                         device_printf ((ha)->pci_dev,           \
  579                                 "[%s:%d]" x,                    \
  580                                 __func__, __LINE__,             \
  581                                 ## __VA_ARGS__);                \
  582                 }                                               \
  583         } while (0)
  584 
  585 #define QL_DPRINT6(ha, x, ...)                                  \
  586         do {                                                    \
  587                 if ((ha)->dbg_level & 0x0020) {                 \
  588                         device_printf ((ha)->pci_dev,           \
  589                                 "[%s:%d]" x,                    \
  590                                 __func__, __LINE__,             \
  591                                 ## __VA_ARGS__);                \
  592                 }                                               \
  593         } while (0)
  594 
  595 #define QL_DPRINT7(ha, x, ...)                                  \
  596         do {                                                    \
  597                 if ((ha)->dbg_level & 0x0040) {                 \
  598                         device_printf ((ha)->pci_dev,           \
  599                                 "[%s:%d]" x,                    \
  600                                 __func__, __LINE__,             \
  601                                 ## __VA_ARGS__);                \
  602                 }                                               \
  603         } while (0)
  604 
  605 #define QL_DPRINT8(ha, x, ...)                                  \
  606         do {                                                    \
  607                 if ((ha)->dbg_level & 0x0080) {                 \
  608                         device_printf ((ha)->pci_dev,           \
  609                                 "[%s:%d]" x,                    \
  610                                 __func__, __LINE__,             \
  611                                 ## __VA_ARGS__);                \
  612                 }                                               \
  613         } while (0)
  614 
  615 #define QL_DPRINT9(ha, x, ...)                                  \
  616         do {                                                    \
  617                 if ((ha)->dbg_level & 0x0100) {                 \
  618                         device_printf ((ha)->pci_dev,           \
  619                                 "[%s:%d]" x,                    \
  620                                 __func__, __LINE__,             \
  621                                 ## __VA_ARGS__);                \
  622                 }                                               \
  623         } while (0)
  624 
  625 #define QL_DPRINT11(ha, x, ...)                                 \
  626         do {                                                    \
  627                 if ((ha)->dbg_level & 0x0400) {                 \
  628                         device_printf ((ha)->pci_dev,           \
  629                                 "[%s:%d]" x,                    \
  630                                 __func__, __LINE__,             \
  631                                 ## __VA_ARGS__);                \
  632                 }                                               \
  633         } while (0)
  634 
  635 #define QL_DPRINT12(ha, x, ...)                                 \
  636         do {                                                    \
  637                 if ((ha)->dbg_level & 0x0800) {                 \
  638                         device_printf ((ha)->pci_dev,           \
  639                                 "[%s:%d]" x,                    \
  640                                 __func__, __LINE__,             \
  641                                 ## __VA_ARGS__);                \
  642                 }                                               \
  643         } while (0)
  644 
  645 #define QL_DPRINT13(ha, x, ...)                                 \
  646         do {                                                    \
  647                 if ((ha)->dbg_level & 0x1000) {                 \
  648                         device_printf ((ha)->pci_dev,           \
  649                                 "[%s:%d]" x,                    \
  650                                 __func__, __LINE__,             \
  651                                 ## __VA_ARGS__);                \
  652                 }                                               \
  653         } while (0)
  654 
  655 #else
  656 
  657 #define QL_DPRINT1(ha, x, ...)
  658 #define QL_DPRINT2(ha, x, ...)
  659 #define QL_DPRINT3(ha, x, ...)
  660 #define QL_DPRINT4(ha, x, ...)
  661 #define QL_DPRINT5(ha, x, ...)
  662 #define QL_DPRINT6(ha, x, ...)
  663 #define QL_DPRINT7(ha, x, ...)
  664 #define QL_DPRINT8(ha, x, ...)
  665 #define QL_DPRINT9(ha, x, ...)
  666 #define QL_DPRINT11(ha, x, ...)
  667 #define QL_DPRINT12(ha, x, ...)
  668 #define QL_DPRINT13(ha, x, ...)
  669 
  670 #endif /* #ifdef QLNX_DEBUG */
  671 
  672 #define QL_ASSERT(ha, x, y)     if (!x) panic y
  673 
  674 #define QL_ERR_INJECT(ha, val)          (ha->err_inject == val)
  675 #define QL_RESET_ERR_INJECT(ha, val)    {if (ha->err_inject == val) ha->err_inject = 0;}
  676 #define QL_ERR_INJCT_TX_INT_DIFF        0x0001
  677 #define QL_ERR_INJCT_TX_INT_MBUF_NULL   0x0002
  678 
  679 /*
  680  * exported functions
  681  */
  682 extern int qlnx_make_cdev(qlnx_host_t *ha);
  683 extern void qlnx_del_cdev(qlnx_host_t *ha);
  684 extern int qlnx_grc_dump(qlnx_host_t *ha, uint32_t *num_dumped_dwords,
  685                 int hwfn_index);
  686 extern int qlnx_idle_chk(qlnx_host_t *ha, uint32_t *num_dumped_dwords,
  687                 int hwfn_index);
  688 extern uint8_t *qlnx_get_mac_addr(qlnx_host_t *ha);
  689 extern void qlnx_fill_link(qlnx_host_t *ha, struct ecore_hwfn *hwfn,
  690                           struct qlnx_link_output *if_link);
  691 extern int qlnx_set_lldp_tlvx(qlnx_host_t *ha, qlnx_lldp_sys_tlvs_t *lldp_tlvs);
  692 extern int qlnx_vf_device(qlnx_host_t *ha);
  693 extern void qlnx_free_mem_sb(qlnx_host_t *ha, struct ecore_sb_info *sb_info);
  694 extern int qlnx_alloc_mem_sb(qlnx_host_t *ha, struct ecore_sb_info *sb_info,
  695                 u16 sb_id);
  696 
  697 /*
  698  * Some OS specific stuff
  699  */
  700 
  701 #if (defined IFM_100G_SR4)
  702 #define QLNX_IFM_100G_SR4 IFM_100G_SR4
  703 #define QLNX_IFM_100G_LR4 IFM_100G_LR4
  704 #define QLNX_IFM_100G_CR4 IFM_100G_CR4
  705 #else
  706 #define QLNX_IFM_100G_SR4 IFM_UNKNOWN
  707 #define QLNX_IFM_100G_LR4 IFM_UNKNOWN
  708 #endif /* #if (defined IFM_100G_SR4) */
  709 
  710 #if (defined IFM_25G_SR)
  711 #define QLNX_IFM_25G_SR IFM_25G_SR
  712 #define QLNX_IFM_25G_CR IFM_25G_CR
  713 #else
  714 #define QLNX_IFM_25G_SR IFM_UNKNOWN
  715 #define QLNX_IFM_25G_CR IFM_UNKNOWN
  716 #endif /* #if (defined IFM_25G_SR) */
  717 
  718 #if __FreeBSD_version < 1100000
  719 
  720 #define QLNX_INC_IERRORS(ifp)           ifp->if_ierrors++
  721 #define QLNX_INC_IQDROPS(ifp)           ifp->if_iqdrops++
  722 #define QLNX_INC_IPACKETS(ifp)          ifp->if_ipackets++
  723 #define QLNX_INC_OPACKETS(ifp)          ifp->if_opackets++
  724 #define QLNX_INC_OBYTES(ifp, len)       ifp->if_obytes += len
  725 #define QLNX_INC_IBYTES(ifp, len)       ifp->if_ibytes += len
  726 
  727 #else
  728 
  729 #define QLNX_INC_IERRORS(ifp)   if_inc_counter(ifp, IFCOUNTER_IERRORS, 1)
  730 #define QLNX_INC_IQDROPS(ifp)   if_inc_counter(ifp, IFCOUNTER_IQDROPS, 1)
  731 #define QLNX_INC_IPACKETS(ifp)  if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1)
  732 #define QLNX_INC_OPACKETS(ifp)  if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1)
  733 
  734 #define QLNX_INC_OBYTES(ifp, len)       \
  735                         if_inc_counter(ifp, IFCOUNTER_OBYTES, len)
  736 #define QLNX_INC_IBYTES(ifp, len)       \
  737                         if_inc_counter(ha->ifp, IFCOUNTER_IBYTES, len)
  738 
  739 #endif /* #if __FreeBSD_version < 1100000 */
  740 
  741 #define CQE_L3_PACKET(flags)    \
  742         ((((flags) & PARSING_AND_ERR_FLAGS_L3TYPE_MASK) == e_l3_type_ipv4) || \
  743         (((flags) & PARSING_AND_ERR_FLAGS_L3TYPE_MASK) == e_l3_type_ipv6))
  744 
  745 #define CQE_IP_HDR_ERR(flags) \
  746         ((flags) & (PARSING_AND_ERR_FLAGS_IPHDRERROR_MASK \
  747                 << PARSING_AND_ERR_FLAGS_IPHDRERROR_SHIFT))
  748 
  749 #define CQE_L4_HAS_CSUM(flags) \
  750         ((flags) & (PARSING_AND_ERR_FLAGS_L4CHKSMWASCALCULATED_MASK \
  751                 << PARSING_AND_ERR_FLAGS_L4CHKSMWASCALCULATED_SHIFT))
  752 
  753 #define CQE_HAS_VLAN(flags) \
  754         ((flags) & (PARSING_AND_ERR_FLAGS_TAG8021QEXIST_MASK \
  755                 << PARSING_AND_ERR_FLAGS_TAG8021QEXIST_SHIFT))
  756 
  757 #ifndef QLNX_RDMA
  758 #if defined(__i386__) || defined(__amd64__)
  759 
  760 static __inline
  761 void prefetch(void *x)
  762 {
  763         __asm volatile("prefetcht0 %0" :: "m" (*(unsigned long *)x));
  764 }
  765 
  766 #else
  767 #define prefetch(x)
  768 #endif
  769 #endif
  770 
  771 #endif /* #ifndef _QLNX_DEF_H_ */

Cache object: 2312b355568e1567ab55828dc7e952f5


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.