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