bna.h (13074B)
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__ */