linux/drivers/net/ethernet/brocade/bna/bna.h
<<
>>
Prefs
   1/*
   2 * Linux network driver for QLogic BR-series Converged Network Adapter.
   3 *
   4 * This program is free software; you can redistribute it and/or modify it
   5 * under the terms of the GNU General Public License (GPL) Version 2 as
   6 * published by the Free Software Foundation
   7 *
   8 * This program is distributed in the hope that it will be useful, but
   9 * WITHOUT ANY WARRANTY; without even the implied warranty of
  10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11 * General Public License for more details.
  12 */
  13/*
  14 * Copyright (c) 2005-2014 Brocade Communications Systems, Inc.
  15 * Copyright (c) 2014-2015 QLogic Corporation
  16 * All rights reserved
  17 * www.qlogic.com
  18 */
  19#ifndef __BNA_H__
  20#define __BNA_H__
  21
  22#include "bfa_defs.h"
  23#include "bfa_ioc.h"
  24#include "bfi_enet.h"
  25#include "bna_types.h"
  26
  27extern const u32 bna_napi_dim_vector[][BNA_BIAS_T_MAX];
  28
  29/*  Macros and constants  */
  30
  31#define bna_is_small_rxq(_id) ((_id) & 0x1)
  32
  33/*
  34 * input : _addr-> os dma addr in host endian format,
  35 * output : _bna_dma_addr-> pointer to hw dma addr
  36 */
  37#define BNA_SET_DMA_ADDR(_addr, _bna_dma_addr)                          \
  38do {                                                                    \
  39        u64 tmp_addr =                                          \
  40        cpu_to_be64((u64)(_addr));                              \
  41        (_bna_dma_addr)->msb = ((struct bna_dma_addr *)&tmp_addr)->msb; \
  42        (_bna_dma_addr)->lsb = ((struct bna_dma_addr *)&tmp_addr)->lsb; \
  43} while (0)
  44
  45/*
  46 * input : _bna_dma_addr-> pointer to hw dma addr
  47 * output : _addr-> os dma addr in host endian format
  48 */
  49#define BNA_GET_DMA_ADDR(_bna_dma_addr, _addr)                  \
  50do {                                                            \
  51        (_addr) = ((((u64)ntohl((_bna_dma_addr)->msb))) << 32)          \
  52        | ((ntohl((_bna_dma_addr)->lsb) & 0xffffffff)); \
  53} while (0)
  54
  55#define BNA_TXQ_WI_NEEDED(_vectors)     (((_vectors) + 3) >> 2)
  56
  57#define BNA_QE_INDX_ADD(_qe_idx, _qe_num, _q_depth)                     \
  58        ((_qe_idx) = ((_qe_idx) + (_qe_num)) & ((_q_depth) - 1))
  59
  60#define BNA_QE_INDX_INC(_idx, _q_depth) BNA_QE_INDX_ADD(_idx, 1, _q_depth)
  61
  62#define BNA_Q_INDEX_CHANGE(_old_idx, _updated_idx, _q_depth)            \
  63        (((_updated_idx) - (_old_idx)) & ((_q_depth) - 1))
  64
  65#define BNA_QE_FREE_CNT(_q_ptr, _q_depth)                               \
  66        (((_q_ptr)->consumer_index - (_q_ptr)->producer_index - 1) &    \
  67         ((_q_depth) - 1))
  68#define BNA_QE_IN_USE_CNT(_q_ptr, _q_depth)                             \
  69        ((((_q_ptr)->producer_index - (_q_ptr)->consumer_index)) &      \
  70         (_q_depth - 1))
  71
  72#define BNA_LARGE_PKT_SIZE              1000
  73
  74#define BNA_UPDATE_PKT_CNT(_pkt, _len)                                  \
  75do {                                                                    \
  76        if ((_len) > BNA_LARGE_PKT_SIZE) {                              \
  77                (_pkt)->large_pkt_cnt++;                                \
  78        } else {                                                        \
  79                (_pkt)->small_pkt_cnt++;                                \
  80        }                                                               \
  81} while (0)
  82
  83#define call_rxf_stop_cbfn(rxf)                                         \
  84do {                                                                    \
  85        if ((rxf)->stop_cbfn) {                                         \
  86                void (*cbfn)(struct bna_rx *);                  \
  87                struct bna_rx *cbarg;                                   \
  88                cbfn = (rxf)->stop_cbfn;                                \
  89                cbarg = (rxf)->stop_cbarg;                              \
  90                (rxf)->stop_cbfn = NULL;                                \
  91                (rxf)->stop_cbarg = NULL;                               \
  92                cbfn(cbarg);                                            \
  93        }                                                               \
  94} while (0)
  95
  96#define call_rxf_start_cbfn(rxf)                                        \
  97do {                                                                    \
  98        if ((rxf)->start_cbfn) {                                        \
  99                void (*cbfn)(struct bna_rx *);                  \
 100                struct bna_rx *cbarg;                                   \
 101                cbfn = (rxf)->start_cbfn;                               \
 102                cbarg = (rxf)->start_cbarg;                             \
 103                (rxf)->start_cbfn = NULL;                               \
 104                (rxf)->start_cbarg = NULL;                              \
 105                cbfn(cbarg);                                            \
 106        }                                                               \
 107} while (0)
 108
 109#define call_rxf_cam_fltr_cbfn(rxf)                                     \
 110do {                                                                    \
 111        if ((rxf)->cam_fltr_cbfn) {                                     \
 112                void (*cbfn)(struct bnad *, struct bna_rx *);   \
 113                struct bnad *cbarg;                                     \
 114                cbfn = (rxf)->cam_fltr_cbfn;                            \
 115                cbarg = (rxf)->cam_fltr_cbarg;                          \
 116                (rxf)->cam_fltr_cbfn = NULL;                            \
 117                (rxf)->cam_fltr_cbarg = NULL;                           \
 118                cbfn(cbarg, rxf->rx);                                   \
 119        }                                                               \
 120} while (0)
 121
 122#define is_xxx_enable(mode, bitmask, xxx) ((bitmask & xxx) && (mode & xxx))
 123
 124#define is_xxx_disable(mode, bitmask, xxx) ((bitmask & xxx) && !(mode & xxx))
 125
 126#define xxx_enable(mode, bitmask, xxx)                                  \
 127do {                                                                    \
 128        bitmask |= xxx;                                                 \
 129        mode |= xxx;                                                    \
 130} while (0)
 131
 132#define xxx_disable(mode, bitmask, xxx)                                 \
 133do {                                                                    \
 134        bitmask |= xxx;                                                 \
 135        mode &= ~xxx;                                                   \
 136} while (0)
 137
 138#define xxx_inactive(mode, bitmask, xxx)                                \
 139do {                                                                    \
 140        bitmask &= ~xxx;                                                \
 141        mode &= ~xxx;                                                   \
 142} while (0)
 143
 144#define is_promisc_enable(mode, bitmask)                                \
 145        is_xxx_enable(mode, bitmask, BNA_RXMODE_PROMISC)
 146
 147#define is_promisc_disable(mode, bitmask)                               \
 148        is_xxx_disable(mode, bitmask, BNA_RXMODE_PROMISC)
 149
 150#define promisc_enable(mode, bitmask)                                   \
 151        xxx_enable(mode, bitmask, BNA_RXMODE_PROMISC)
 152
 153#define promisc_disable(mode, bitmask)                                  \
 154        xxx_disable(mode, bitmask, BNA_RXMODE_PROMISC)
 155
 156#define promisc_inactive(mode, bitmask)                                 \
 157        xxx_inactive(mode, bitmask, BNA_RXMODE_PROMISC)
 158
 159#define is_default_enable(mode, bitmask)                                \
 160        is_xxx_enable(mode, bitmask, BNA_RXMODE_DEFAULT)
 161
 162#define is_default_disable(mode, bitmask)                               \
 163        is_xxx_disable(mode, bitmask, BNA_RXMODE_DEFAULT)
 164
 165#define default_enable(mode, bitmask)                                   \
 166        xxx_enable(mode, bitmask, BNA_RXMODE_DEFAULT)
 167
 168#define default_disable(mode, bitmask)                                  \
 169        xxx_disable(mode, bitmask, BNA_RXMODE_DEFAULT)
 170
 171#define default_inactive(mode, bitmask)                                 \
 172        xxx_inactive(mode, bitmask, BNA_RXMODE_DEFAULT)
 173
 174#define is_allmulti_enable(mode, bitmask)                               \
 175        is_xxx_enable(mode, bitmask, BNA_RXMODE_ALLMULTI)
 176
 177#define is_allmulti_disable(mode, bitmask)                              \
 178        is_xxx_disable(mode, bitmask, BNA_RXMODE_ALLMULTI)
 179
 180#define allmulti_enable(mode, bitmask)                                  \
 181        xxx_enable(mode, bitmask, BNA_RXMODE_ALLMULTI)
 182
 183#define allmulti_disable(mode, bitmask)                                 \
 184        xxx_disable(mode, bitmask, BNA_RXMODE_ALLMULTI)
 185
 186#define allmulti_inactive(mode, bitmask)                                \
 187        xxx_inactive(mode, bitmask, BNA_RXMODE_ALLMULTI)
 188
 189#define GET_RXQS(rxp, q0, q1)   do {                                    \
 190        switch ((rxp)->type) {                                          \
 191        case BNA_RXP_SINGLE:                                            \
 192                (q0) = rxp->rxq.single.only;                            \
 193                (q1) = NULL;                                            \
 194                break;                                                  \
 195        case BNA_RXP_SLR:                                               \
 196                (q0) = rxp->rxq.slr.large;                              \
 197                (q1) = rxp->rxq.slr.small;                              \
 198                break;                                                  \
 199        case BNA_RXP_HDS:                                               \
 200                (q0) = rxp->rxq.hds.data;                               \
 201                (q1) = rxp->rxq.hds.hdr;                                \
 202                break;                                                  \
 203        }                                                               \
 204} while (0)
 205
 206#define bna_tx_rid_mask(_bna) ((_bna)->tx_mod.rid_mask)
 207
 208#define bna_rx_rid_mask(_bna) ((_bna)->rx_mod.rid_mask)
 209
 210#define bna_tx_from_rid(_bna, _rid, _tx)                                \
 211do {                                                                    \
 212        struct bna_tx_mod *__tx_mod = &(_bna)->tx_mod;                  \
 213        struct bna_tx *__tx;                                            \
 214        _tx = NULL;                                                     \
 215        list_for_each_entry(__tx, &__tx_mod->tx_active_q, qe) {         \
 216                if (__tx->rid == (_rid)) {                              \
 217                        (_tx) = __tx;                                   \
 218                        break;                                          \
 219                }                                                       \
 220        }                                                               \
 221} while (0)
 222
 223#define bna_rx_from_rid(_bna, _rid, _rx)                                \
 224do {                                                                    \
 225        struct bna_rx_mod *__rx_mod = &(_bna)->rx_mod;                  \
 226        struct bna_rx *__rx;                                            \
 227        _rx = NULL;                                                     \
 228        list_for_each_entry(__rx, &__rx_mod->rx_active_q, qe) {         \
 229                if (__rx->rid == (_rid)) {                              \
 230                        (_rx) = __rx;                                   \
 231                        break;                                          \
 232                }                                                       \
 233        }                                                               \
 234} while (0)
 235
 236#define bna_mcam_mod_free_q(_bna) (&(_bna)->mcam_mod.free_q)
 237
 238#define bna_mcam_mod_del_q(_bna) (&(_bna)->mcam_mod.del_q)
 239
 240#define bna_ucam_mod_free_q(_bna) (&(_bna)->ucam_mod.free_q)
 241
 242#define bna_ucam_mod_del_q(_bna) (&(_bna)->ucam_mod.del_q)
 243
 244/*  Inline functions  */
 245
 246static inline struct bna_mac *bna_mac_find(struct list_head *q, const u8 *addr)
 247{
 248        struct bna_mac *mac;
 249
 250        list_for_each_entry(mac, q, qe)
 251                if (ether_addr_equal(mac->addr, addr))
 252                        return mac;
 253        return NULL;
 254}
 255
 256#define bna_attr(_bna) (&(_bna)->ioceth.attr)
 257
 258/* Function prototypes */
 259
 260/* BNA */
 261
 262/* FW response handlers */
 263void bna_bfi_stats_clr_rsp(struct bna *bna, struct bfi_msgq_mhdr *msghdr);
 264
 265/* APIs for BNAD */
 266void bna_res_req(struct bna_res_info *res_info);
 267void bna_mod_res_req(struct bna *bna, struct bna_res_info *res_info);
 268void bna_init(struct bna *bna, struct bnad *bnad,
 269                        struct bfa_pcidev *pcidev,
 270                        struct bna_res_info *res_info);
 271void bna_mod_init(struct bna *bna, struct bna_res_info *res_info);
 272void bna_uninit(struct bna *bna);
 273int bna_num_txq_set(struct bna *bna, int num_txq);
 274int bna_num_rxp_set(struct bna *bna, int num_rxp);
 275void bna_hw_stats_get(struct bna *bna);
 276
 277/* APIs for RxF */
 278struct bna_mac *bna_cam_mod_mac_get(struct list_head *head);
 279struct bna_mcam_handle *bna_mcam_mod_handle_get(struct bna_mcam_mod *mod);
 280void bna_mcam_mod_handle_put(struct bna_mcam_mod *mcam_mod,
 281                          struct bna_mcam_handle *handle);
 282
 283/* MBOX */
 284
 285/* API for BNAD */
 286void bna_mbox_handler(struct bna *bna, u32 intr_status);
 287
 288/* ETHPORT */
 289
 290/* Callbacks for RX */
 291void bna_ethport_cb_rx_started(struct bna_ethport *ethport);
 292void bna_ethport_cb_rx_stopped(struct bna_ethport *ethport);
 293
 294/* TX MODULE AND TX */
 295
 296/* FW response handelrs */
 297void bna_bfi_tx_enet_start_rsp(struct bna_tx *tx,
 298                               struct bfi_msgq_mhdr *msghdr);
 299void bna_bfi_tx_enet_stop_rsp(struct bna_tx *tx,
 300                              struct bfi_msgq_mhdr *msghdr);
 301void bna_bfi_bw_update_aen(struct bna_tx_mod *tx_mod);
 302
 303/* APIs for BNA */
 304void bna_tx_mod_init(struct bna_tx_mod *tx_mod, struct bna *bna,
 305                     struct bna_res_info *res_info);
 306void bna_tx_mod_uninit(struct bna_tx_mod *tx_mod);
 307
 308/* APIs for ENET */
 309void bna_tx_mod_start(struct bna_tx_mod *tx_mod, enum bna_tx_type type);
 310void bna_tx_mod_stop(struct bna_tx_mod *tx_mod, enum bna_tx_type type);
 311void bna_tx_mod_fail(struct bna_tx_mod *tx_mod);
 312
 313/* APIs for BNAD */
 314void bna_tx_res_req(int num_txq, int txq_depth,
 315                    struct bna_res_info *res_info);
 316struct bna_tx *bna_tx_create(struct bna *bna, struct bnad *bnad,
 317                               struct bna_tx_config *tx_cfg,
 318                               const struct bna_tx_event_cbfn *tx_cbfn,
 319                               struct bna_res_info *res_info, void *priv);
 320void bna_tx_destroy(struct bna_tx *tx);
 321void bna_tx_enable(struct bna_tx *tx);
 322void bna_tx_disable(struct bna_tx *tx, enum bna_cleanup_type type,
 323                    void (*cbfn)(void *, struct bna_tx *));
 324void bna_tx_cleanup_complete(struct bna_tx *tx);
 325void bna_tx_coalescing_timeo_set(struct bna_tx *tx, int coalescing_timeo);
 326
 327/* RX MODULE, RX, RXF */
 328
 329/* FW response handlers */
 330void bna_bfi_rx_enet_start_rsp(struct bna_rx *rx,
 331                               struct bfi_msgq_mhdr *msghdr);
 332void bna_bfi_rx_enet_stop_rsp(struct bna_rx *rx,
 333                              struct bfi_msgq_mhdr *msghdr);
 334void bna_bfi_rxf_cfg_rsp(struct bna_rxf *rxf, struct bfi_msgq_mhdr *msghdr);
 335void bna_bfi_rxf_mcast_add_rsp(struct bna_rxf *rxf,
 336                               struct bfi_msgq_mhdr *msghdr);
 337void bna_bfi_rxf_ucast_set_rsp(struct bna_rxf *rxf,
 338                               struct bfi_msgq_mhdr *msghdr);
 339
 340/* APIs for BNA */
 341void bna_rx_mod_init(struct bna_rx_mod *rx_mod, struct bna *bna,
 342                     struct bna_res_info *res_info);
 343void bna_rx_mod_uninit(struct bna_rx_mod *rx_mod);
 344
 345/* APIs for ENET */
 346void bna_rx_mod_start(struct bna_rx_mod *rx_mod, enum bna_rx_type type);
 347void bna_rx_mod_stop(struct bna_rx_mod *rx_mod, enum bna_rx_type type);
 348void bna_rx_mod_fail(struct bna_rx_mod *rx_mod);
 349
 350/* APIs for BNAD */
 351void bna_rx_res_req(struct bna_rx_config *rx_config,
 352                    struct bna_res_info *res_info);
 353struct bna_rx *bna_rx_create(struct bna *bna, struct bnad *bnad,
 354                               struct bna_rx_config *rx_cfg,
 355                               const struct bna_rx_event_cbfn *rx_cbfn,
 356                               struct bna_res_info *res_info, void *priv);
 357void bna_rx_destroy(struct bna_rx *rx);
 358void bna_rx_enable(struct bna_rx *rx);
 359void bna_rx_disable(struct bna_rx *rx, enum bna_cleanup_type type,
 360                    void (*cbfn)(void *, struct bna_rx *));
 361void bna_rx_cleanup_complete(struct bna_rx *rx);
 362void bna_rx_coalescing_timeo_set(struct bna_rx *rx, int coalescing_timeo);
 363void bna_rx_dim_reconfig(struct bna *bna, const u32 vector[][BNA_BIAS_T_MAX]);
 364void bna_rx_dim_update(struct bna_ccb *ccb);
 365enum bna_cb_status bna_rx_ucast_set(struct bna_rx *rx, const u8 *ucmac);
 366enum bna_cb_status bna_rx_ucast_listset(struct bna_rx *rx, int count,
 367                                        const u8 *uclist);
 368enum bna_cb_status bna_rx_mcast_add(struct bna_rx *rx, const u8 *mcmac,
 369                                    void (*cbfn)(struct bnad *,
 370                                                 struct bna_rx *));
 371enum bna_cb_status bna_rx_mcast_listset(struct bna_rx *rx, int count,
 372                                        const u8 *mcmac);
 373void
 374bna_rx_mcast_delall(struct bna_rx *rx);
 375enum bna_cb_status
 376bna_rx_mode_set(struct bna_rx *rx, enum bna_rxmode rxmode,
 377                enum bna_rxmode bitmask);
 378void bna_rx_vlan_add(struct bna_rx *rx, int vlan_id);
 379void bna_rx_vlan_del(struct bna_rx *rx, int vlan_id);
 380void bna_rx_vlanfilter_enable(struct bna_rx *rx);
 381void bna_rx_vlan_strip_enable(struct bna_rx *rx);
 382void bna_rx_vlan_strip_disable(struct bna_rx *rx);
 383/* ENET */
 384
 385/* API for RX */
 386int bna_enet_mtu_get(struct bna_enet *enet);
 387
 388/* Callbacks for TX, RX */
 389void bna_enet_cb_tx_stopped(struct bna_enet *enet);
 390void bna_enet_cb_rx_stopped(struct bna_enet *enet);
 391
 392/* API for BNAD */
 393void bna_enet_enable(struct bna_enet *enet);
 394void bna_enet_disable(struct bna_enet *enet, enum bna_cleanup_type type,
 395                      void (*cbfn)(void *));
 396void bna_enet_pause_config(struct bna_enet *enet,
 397                           struct bna_pause_config *pause_config);
 398void bna_enet_mtu_set(struct bna_enet *enet, int mtu,
 399                      void (*cbfn)(struct bnad *));
 400void bna_enet_perm_mac_get(struct bna_enet *enet, u8 *mac);
 401
 402/* IOCETH */
 403
 404/* APIs for BNAD */
 405void bna_ioceth_enable(struct bna_ioceth *ioceth);
 406void bna_ioceth_disable(struct bna_ioceth *ioceth,
 407                        enum bna_cleanup_type type);
 408
 409/* BNAD */
 410
 411/* Callbacks for ENET */
 412void bnad_cb_ethport_link_status(struct bnad *bnad,
 413                              enum bna_link_status status);
 414
 415/* Callbacks for IOCETH */
 416void bnad_cb_ioceth_ready(struct bnad *bnad);
 417void bnad_cb_ioceth_failed(struct bnad *bnad);
 418void bnad_cb_ioceth_disabled(struct bnad *bnad);
 419void bnad_cb_mbox_intr_enable(struct bnad *bnad);
 420void bnad_cb_mbox_intr_disable(struct bnad *bnad);
 421
 422/* Callbacks for BNA */
 423void bnad_cb_stats_get(struct bnad *bnad, enum bna_cb_status status,
 424                       struct bna_stats *stats);
 425
 426#endif  /* __BNA_H__ */
 427