linux/drivers/net/ethernet/brocade/bna/bna_types.h
<<
>>
Prefs
   1/*
   2 * Linux network driver for Brocade 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-2010 Brocade Communications Systems, Inc.
  15 * All rights reserved
  16 * www.brocade.com
  17 */
  18#ifndef __BNA_TYPES_H__
  19#define __BNA_TYPES_H__
  20
  21#include "cna.h"
  22#include "bna_hw_defs.h"
  23#include "bfa_cee.h"
  24#include "bfa_msgq.h"
  25
  26/* Forward declarations */
  27
  28struct bna_mcam_handle;
  29struct bna_txq;
  30struct bna_tx;
  31struct bna_rxq;
  32struct bna_cq;
  33struct bna_rx;
  34struct bna_rxf;
  35struct bna_enet;
  36struct bna;
  37struct bnad;
  38
  39/* Enums, primitive data types */
  40
  41enum bna_status {
  42        BNA_STATUS_T_DISABLED   = 0,
  43        BNA_STATUS_T_ENABLED    = 1
  44};
  45
  46enum bna_cleanup_type {
  47        BNA_HARD_CLEANUP        = 0,
  48        BNA_SOFT_CLEANUP        = 1
  49};
  50
  51enum bna_cb_status {
  52        BNA_CB_SUCCESS          = 0,
  53        BNA_CB_FAIL             = 1,
  54        BNA_CB_INTERRUPT        = 2,
  55        BNA_CB_BUSY             = 3,
  56        BNA_CB_INVALID_MAC      = 4,
  57        BNA_CB_MCAST_LIST_FULL  = 5,
  58        BNA_CB_UCAST_CAM_FULL   = 6,
  59        BNA_CB_WAITING          = 7,
  60        BNA_CB_NOT_EXEC         = 8
  61};
  62
  63enum bna_res_type {
  64        BNA_RES_T_MEM           = 1,
  65        BNA_RES_T_INTR          = 2
  66};
  67
  68enum bna_mem_type {
  69        BNA_MEM_T_KVA           = 1,
  70        BNA_MEM_T_DMA           = 2
  71};
  72
  73enum bna_intr_type {
  74        BNA_INTR_T_INTX         = 1,
  75        BNA_INTR_T_MSIX         = 2
  76};
  77
  78enum bna_res_req_type {
  79        BNA_RES_MEM_T_COM               = 0,
  80        BNA_RES_MEM_T_ATTR              = 1,
  81        BNA_RES_MEM_T_FWTRC             = 2,
  82        BNA_RES_MEM_T_STATS             = 3,
  83        BNA_RES_T_MAX
  84};
  85
  86enum bna_mod_res_req_type {
  87        BNA_MOD_RES_MEM_T_TX_ARRAY      = 0,
  88        BNA_MOD_RES_MEM_T_TXQ_ARRAY     = 1,
  89        BNA_MOD_RES_MEM_T_RX_ARRAY      = 2,
  90        BNA_MOD_RES_MEM_T_RXP_ARRAY     = 3,
  91        BNA_MOD_RES_MEM_T_RXQ_ARRAY     = 4,
  92        BNA_MOD_RES_MEM_T_UCMAC_ARRAY   = 5,
  93        BNA_MOD_RES_MEM_T_MCMAC_ARRAY   = 6,
  94        BNA_MOD_RES_MEM_T_MCHANDLE_ARRAY = 7,
  95        BNA_MOD_RES_T_MAX
  96};
  97
  98enum bna_tx_res_req_type {
  99        BNA_TX_RES_MEM_T_TCB    = 0,
 100        BNA_TX_RES_MEM_T_UNMAPQ = 1,
 101        BNA_TX_RES_MEM_T_QPT    = 2,
 102        BNA_TX_RES_MEM_T_SWQPT  = 3,
 103        BNA_TX_RES_MEM_T_PAGE   = 4,
 104        BNA_TX_RES_MEM_T_IBIDX  = 5,
 105        BNA_TX_RES_INTR_T_TXCMPL = 6,
 106        BNA_TX_RES_T_MAX,
 107};
 108
 109enum bna_rx_mem_type {
 110        BNA_RX_RES_MEM_T_CCB            = 0,    /* CQ context */
 111        BNA_RX_RES_MEM_T_RCB            = 1,    /* CQ context */
 112        BNA_RX_RES_MEM_T_UNMAPQ         = 2,    /* UnmapQ for RxQs */
 113        BNA_RX_RES_MEM_T_CQPT           = 3,    /* CQ QPT */
 114        BNA_RX_RES_MEM_T_CSWQPT         = 4,    /* S/W QPT */
 115        BNA_RX_RES_MEM_T_CQPT_PAGE      = 5,    /* CQPT page */
 116        BNA_RX_RES_MEM_T_HQPT           = 6,    /* RX QPT */
 117        BNA_RX_RES_MEM_T_DQPT           = 7,    /* RX QPT */
 118        BNA_RX_RES_MEM_T_HSWQPT         = 8,    /* RX s/w QPT */
 119        BNA_RX_RES_MEM_T_DSWQPT         = 9,    /* RX s/w QPT */
 120        BNA_RX_RES_MEM_T_DPAGE          = 10,   /* RX s/w QPT */
 121        BNA_RX_RES_MEM_T_HPAGE          = 11,   /* RX s/w QPT */
 122        BNA_RX_RES_MEM_T_IBIDX          = 12,
 123        BNA_RX_RES_MEM_T_RIT            = 13,
 124        BNA_RX_RES_T_INTR               = 14,   /* Rx interrupts */
 125        BNA_RX_RES_T_MAX                = 15
 126};
 127
 128enum bna_tx_type {
 129        BNA_TX_T_REGULAR        = 0,
 130        BNA_TX_T_LOOPBACK       = 1,
 131};
 132
 133enum bna_tx_flags {
 134        BNA_TX_F_ENET_STARTED   = 1,
 135        BNA_TX_F_ENABLED        = 2,
 136        BNA_TX_F_PRIO_CHANGED   = 4,
 137        BNA_TX_F_BW_UPDATED     = 8,
 138};
 139
 140enum bna_tx_mod_flags {
 141        BNA_TX_MOD_F_ENET_STARTED       = 1,
 142        BNA_TX_MOD_F_ENET_LOOPBACK      = 2,
 143};
 144
 145enum bna_rx_type {
 146        BNA_RX_T_REGULAR        = 0,
 147        BNA_RX_T_LOOPBACK       = 1,
 148};
 149
 150enum bna_rxp_type {
 151        BNA_RXP_SINGLE          = 1,
 152        BNA_RXP_SLR             = 2,
 153        BNA_RXP_HDS             = 3
 154};
 155
 156enum bna_rxmode {
 157        BNA_RXMODE_PROMISC      = 1,
 158        BNA_RXMODE_DEFAULT      = 2,
 159        BNA_RXMODE_ALLMULTI     = 4
 160};
 161
 162enum bna_rx_event {
 163        RX_E_START                      = 1,
 164        RX_E_STOP                       = 2,
 165        RX_E_FAIL                       = 3,
 166        RX_E_STARTED                    = 4,
 167        RX_E_STOPPED                    = 5,
 168        RX_E_RXF_STARTED                = 6,
 169        RX_E_RXF_STOPPED                = 7,
 170        RX_E_CLEANUP_DONE               = 8,
 171};
 172
 173enum bna_rx_flags {
 174        BNA_RX_F_ENET_STARTED   = 1,
 175        BNA_RX_F_ENABLED        = 2,
 176};
 177
 178enum bna_rx_mod_flags {
 179        BNA_RX_MOD_F_ENET_STARTED       = 1,
 180        BNA_RX_MOD_F_ENET_LOOPBACK      = 2,
 181};
 182
 183enum bna_rxf_flags {
 184        BNA_RXF_F_PAUSED                = 1,
 185};
 186
 187enum bna_rxf_event {
 188        RXF_E_START                     = 1,
 189        RXF_E_STOP                      = 2,
 190        RXF_E_FAIL                      = 3,
 191        RXF_E_CONFIG                    = 4,
 192        RXF_E_PAUSE                     = 5,
 193        RXF_E_RESUME                    = 6,
 194        RXF_E_FW_RESP                   = 7,
 195};
 196
 197enum bna_enet_type {
 198        BNA_ENET_T_REGULAR              = 0,
 199        BNA_ENET_T_LOOPBACK_INTERNAL    = 1,
 200        BNA_ENET_T_LOOPBACK_EXTERNAL    = 2,
 201};
 202
 203enum bna_link_status {
 204        BNA_LINK_DOWN           = 0,
 205        BNA_LINK_UP             = 1,
 206        BNA_CEE_UP              = 2
 207};
 208
 209enum bna_ethport_flags {
 210        BNA_ETHPORT_F_ADMIN_UP          = 1,
 211        BNA_ETHPORT_F_PORT_ENABLED      = 2,
 212        BNA_ETHPORT_F_RX_STARTED        = 4,
 213};
 214
 215enum bna_enet_flags {
 216        BNA_ENET_F_IOCETH_READY         = 1,
 217        BNA_ENET_F_ENABLED              = 2,
 218        BNA_ENET_F_PAUSE_CHANGED        = 4,
 219        BNA_ENET_F_MTU_CHANGED          = 8
 220};
 221
 222enum bna_rss_flags {
 223        BNA_RSS_F_RIT_PENDING           = 1,
 224        BNA_RSS_F_CFG_PENDING           = 2,
 225        BNA_RSS_F_STATUS_PENDING        = 4,
 226};
 227
 228enum bna_mod_flags {
 229        BNA_MOD_F_INIT_DONE             = 1,
 230};
 231
 232enum bna_pkt_rates {
 233        BNA_PKT_RATE_10K                = 10000,
 234        BNA_PKT_RATE_20K                = 20000,
 235        BNA_PKT_RATE_30K                = 30000,
 236        BNA_PKT_RATE_40K                = 40000,
 237        BNA_PKT_RATE_50K                = 50000,
 238        BNA_PKT_RATE_60K                = 60000,
 239        BNA_PKT_RATE_70K                = 70000,
 240        BNA_PKT_RATE_80K                = 80000,
 241};
 242
 243enum bna_dim_load_types {
 244        BNA_LOAD_T_HIGH_4               = 0, /* 80K <= r */
 245        BNA_LOAD_T_HIGH_3               = 1, /* 60K <= r < 80K */
 246        BNA_LOAD_T_HIGH_2               = 2, /* 50K <= r < 60K */
 247        BNA_LOAD_T_HIGH_1               = 3, /* 40K <= r < 50K */
 248        BNA_LOAD_T_LOW_1                = 4, /* 30K <= r < 40K */
 249        BNA_LOAD_T_LOW_2                = 5, /* 20K <= r < 30K */
 250        BNA_LOAD_T_LOW_3                = 6, /* 10K <= r < 20K */
 251        BNA_LOAD_T_LOW_4                = 7, /* r < 10K */
 252        BNA_LOAD_T_MAX                  = 8
 253};
 254
 255enum bna_dim_bias_types {
 256        BNA_BIAS_T_SMALL                = 0, /* small pkts > (large pkts * 2) */
 257        BNA_BIAS_T_LARGE                = 1, /* Not BNA_BIAS_T_SMALL */
 258        BNA_BIAS_T_MAX                  = 2
 259};
 260
 261#define BNA_MAX_NAME_SIZE       64
 262struct bna_ident {
 263        int                     id;
 264        char                    name[BNA_MAX_NAME_SIZE];
 265};
 266
 267struct bna_mac {
 268        /* This should be the first one */
 269        struct list_head                        qe;
 270        u8                      addr[ETH_ALEN];
 271        struct bna_mcam_handle *handle;
 272};
 273
 274struct bna_mem_descr {
 275        u32             len;
 276        void            *kva;
 277        struct bna_dma_addr dma;
 278};
 279
 280struct bna_mem_info {
 281        enum bna_mem_type mem_type;
 282        u32             len;
 283        u32             num;
 284        u32             align_sz; /* 0/1 = no alignment */
 285        struct bna_mem_descr *mdl;
 286        void                    *cookie; /* For bnad to unmap dma later */
 287};
 288
 289struct bna_intr_descr {
 290        int                     vector;
 291};
 292
 293struct bna_intr_info {
 294        enum bna_intr_type intr_type;
 295        int                     num;
 296        struct bna_intr_descr *idl;
 297};
 298
 299union bna_res_u {
 300        struct bna_mem_info mem_info;
 301        struct bna_intr_info intr_info;
 302};
 303
 304struct bna_res_info {
 305        enum bna_res_type res_type;
 306        union bna_res_u         res_u;
 307};
 308
 309/* HW QPT */
 310struct bna_qpt {
 311        struct bna_dma_addr hw_qpt_ptr;
 312        void            *kv_qpt_ptr;
 313        u32             page_count;
 314        u32             page_size;
 315};
 316
 317struct bna_attr {
 318        bool                    fw_query_complete;
 319        int                     num_txq;
 320        int                     num_rxp;
 321        int                     num_ucmac;
 322        int                     num_mcmac;
 323        int                     max_rit_size;
 324};
 325
 326/* IOCEth */
 327
 328struct bna_ioceth {
 329        bfa_fsm_t               fsm;
 330        struct bfa_ioc ioc;
 331
 332        struct bna_attr attr;
 333        struct bfa_msgq_cmd_entry msgq_cmd;
 334        struct bfi_enet_attr_req attr_req;
 335
 336        void (*stop_cbfn)(struct bnad *bnad);
 337        struct bnad *stop_cbarg;
 338
 339        struct bna *bna;
 340};
 341
 342/* Enet */
 343
 344/* Pause configuration */
 345struct bna_pause_config {
 346        enum bna_status tx_pause;
 347        enum bna_status rx_pause;
 348};
 349
 350struct bna_enet {
 351        bfa_fsm_t               fsm;
 352        enum bna_enet_flags flags;
 353
 354        enum bna_enet_type type;
 355
 356        struct bna_pause_config pause_config;
 357        int                     mtu;
 358
 359        /* Callback for bna_enet_disable(), enet_stop() */
 360        void (*stop_cbfn)(void *);
 361        void                    *stop_cbarg;
 362
 363        /* Callback for bna_enet_pause_config() */
 364        void (*pause_cbfn)(struct bnad *);
 365
 366        /* Callback for bna_enet_mtu_set() */
 367        void (*mtu_cbfn)(struct bnad *);
 368
 369        struct bfa_wc           chld_stop_wc;
 370
 371        struct bfa_msgq_cmd_entry msgq_cmd;
 372        struct bfi_enet_set_pause_req pause_req;
 373
 374        struct bna *bna;
 375};
 376
 377/* Ethport */
 378
 379struct bna_ethport {
 380        bfa_fsm_t               fsm;
 381        enum bna_ethport_flags flags;
 382
 383        enum bna_link_status link_status;
 384
 385        int                     rx_started_count;
 386
 387        void (*stop_cbfn)(struct bna_enet *);
 388
 389        void (*adminup_cbfn)(struct bnad *, enum bna_cb_status);
 390
 391        void (*link_cbfn)(struct bnad *, enum bna_link_status);
 392
 393        struct bfa_msgq_cmd_entry msgq_cmd;
 394        union {
 395                struct bfi_enet_enable_req admin_req;
 396                struct bfi_enet_diag_lb_req lpbk_req;
 397        } bfi_enet_cmd;
 398
 399        struct bna *bna;
 400};
 401
 402/* Interrupt Block */
 403
 404/* Doorbell structure */
 405struct bna_ib_dbell {
 406        void __iomem   *doorbell_addr;
 407        u32             doorbell_ack;
 408};
 409
 410/* IB structure */
 411struct bna_ib {
 412        struct bna_dma_addr ib_seg_host_addr;
 413        void            *ib_seg_host_addr_kva;
 414
 415        struct bna_ib_dbell door_bell;
 416
 417        enum bna_intr_type      intr_type;
 418        int                     intr_vector;
 419
 420        u8                      coalescing_timeo;    /* Unit is 5usec. */
 421
 422        int                     interpkt_count;
 423        int                     interpkt_timeo;
 424};
 425
 426/* Tx object */
 427
 428/* Tx datapath control structure */
 429#define BNA_Q_NAME_SIZE         16
 430struct bna_tcb {
 431        /* Fast path */
 432        void                    **sw_qpt;
 433        void                    *sw_q;
 434        void                    *unmap_q;
 435        u32             producer_index;
 436        u32             consumer_index;
 437        volatile u32    *hw_consumer_index;
 438        u32             q_depth;
 439        void __iomem   *q_dbell;
 440        struct bna_ib_dbell *i_dbell;
 441        /* Control path */
 442        struct bna_txq *txq;
 443        struct bnad *bnad;
 444        void                    *priv; /* BNAD's cookie */
 445        enum bna_intr_type intr_type;
 446        int                     intr_vector;
 447        u8                      priority; /* Current priority */
 448        unsigned long           flags; /* Used by bnad as required */
 449        int                     id;
 450        char                    name[BNA_Q_NAME_SIZE];
 451};
 452
 453/* TxQ QPT and configuration */
 454struct bna_txq {
 455        /* This should be the first one */
 456        struct list_head                        qe;
 457
 458        u8                      priority;
 459
 460        struct bna_qpt qpt;
 461        struct bna_tcb *tcb;
 462        struct bna_ib ib;
 463
 464        struct bna_tx *tx;
 465
 466        int                     hw_id;
 467
 468        u64             tx_packets;
 469        u64             tx_bytes;
 470};
 471
 472/* Tx object */
 473struct bna_tx {
 474        /* This should be the first one */
 475        struct list_head                        qe;
 476        int                     rid;
 477        int                     hw_id;
 478
 479        bfa_fsm_t               fsm;
 480        enum bna_tx_flags flags;
 481
 482        enum bna_tx_type type;
 483        int                     num_txq;
 484
 485        struct list_head                        txq_q;
 486        u16                     txf_vlan_id;
 487
 488        /* Tx event handlers */
 489        void (*tcb_setup_cbfn)(struct bnad *, struct bna_tcb *);
 490        void (*tcb_destroy_cbfn)(struct bnad *, struct bna_tcb *);
 491        void (*tx_stall_cbfn)(struct bnad *, struct bna_tx *);
 492        void (*tx_resume_cbfn)(struct bnad *, struct bna_tx *);
 493        void (*tx_cleanup_cbfn)(struct bnad *, struct bna_tx *);
 494
 495        /* callback for bna_tx_disable(), bna_tx_stop() */
 496        void (*stop_cbfn)(void *arg, struct bna_tx *tx);
 497        void                    *stop_cbarg;
 498
 499        /* callback for bna_tx_prio_set() */
 500        void (*prio_change_cbfn)(struct bnad *bnad, struct bna_tx *tx);
 501
 502        struct bfa_msgq_cmd_entry msgq_cmd;
 503        union {
 504                struct bfi_enet_tx_cfg_req      cfg_req;
 505                struct bfi_enet_req             req;
 506                struct bfi_enet_tx_cfg_rsp      cfg_rsp;
 507        } bfi_enet_cmd;
 508
 509        struct bna *bna;
 510        void                    *priv;  /* bnad's cookie */
 511};
 512
 513/* Tx object configuration used during creation */
 514struct bna_tx_config {
 515        int                     num_txq;
 516        int                     txq_depth;
 517        int                     coalescing_timeo;
 518        enum bna_tx_type tx_type;
 519};
 520
 521struct bna_tx_event_cbfn {
 522        /* Optional */
 523        void (*tcb_setup_cbfn)(struct bnad *, struct bna_tcb *);
 524        void (*tcb_destroy_cbfn)(struct bnad *, struct bna_tcb *);
 525        /* Mandatory */
 526        void (*tx_stall_cbfn)(struct bnad *, struct bna_tx *);
 527        void (*tx_resume_cbfn)(struct bnad *, struct bna_tx *);
 528        void (*tx_cleanup_cbfn)(struct bnad *, struct bna_tx *);
 529};
 530
 531/* Tx module - keeps track of free, active tx objects */
 532struct bna_tx_mod {
 533        struct bna_tx *tx;              /* BFI_MAX_TXQ entries */
 534        struct bna_txq *txq;            /* BFI_MAX_TXQ entries */
 535
 536        struct list_head                        tx_free_q;
 537        struct list_head                        tx_active_q;
 538
 539        struct list_head                        txq_free_q;
 540
 541        /* callback for bna_tx_mod_stop() */
 542        void (*stop_cbfn)(struct bna_enet *enet);
 543
 544        struct bfa_wc           tx_stop_wc;
 545
 546        enum bna_tx_mod_flags flags;
 547
 548        u8                      prio_map;
 549        int                     default_prio;
 550        int                     iscsi_over_cee;
 551        int                     iscsi_prio;
 552        int                     prio_reconfigured;
 553
 554        u32                     rid_mask;
 555
 556        struct bna *bna;
 557};
 558
 559/* Rx object */
 560
 561/* Rx datapath control structure */
 562struct bna_rcb {
 563        /* Fast path */
 564        void                    **sw_qpt;
 565        void                    *sw_q;
 566        void                    *unmap_q;
 567        u32             producer_index;
 568        u32             consumer_index;
 569        u32             q_depth;
 570        void __iomem   *q_dbell;
 571        /* Control path */
 572        struct bna_rxq *rxq;
 573        struct bna_ccb *ccb;
 574        struct bnad *bnad;
 575        void                    *priv; /* BNAD's cookie */
 576        unsigned long           flags;
 577        int                     id;
 578};
 579
 580/* RxQ structure - QPT, configuration */
 581struct bna_rxq {
 582        struct list_head                        qe;
 583
 584        int                     buffer_size;
 585        int                     q_depth;
 586
 587        struct bna_qpt qpt;
 588        struct bna_rcb *rcb;
 589
 590        struct bna_rxp *rxp;
 591        struct bna_rx *rx;
 592
 593        int                     hw_id;
 594
 595        u64             rx_packets;
 596        u64             rx_bytes;
 597        u64             rx_packets_with_error;
 598        u64             rxbuf_alloc_failed;
 599};
 600
 601/* RxQ pair */
 602union bna_rxq_u {
 603        struct {
 604                struct bna_rxq *hdr;
 605                struct bna_rxq *data;
 606        } hds;
 607        struct {
 608                struct bna_rxq *small;
 609                struct bna_rxq *large;
 610        } slr;
 611        struct {
 612                struct bna_rxq *only;
 613                struct bna_rxq *reserved;
 614        } single;
 615};
 616
 617/* Packet rate for Dynamic Interrupt Moderation */
 618struct bna_pkt_rate {
 619        u32             small_pkt_cnt;
 620        u32             large_pkt_cnt;
 621};
 622
 623/* Completion control structure */
 624struct bna_ccb {
 625        /* Fast path */
 626        void                    **sw_qpt;
 627        void                    *sw_q;
 628        u32             producer_index;
 629        volatile u32    *hw_producer_index;
 630        u32             q_depth;
 631        struct bna_ib_dbell *i_dbell;
 632        struct bna_rcb *rcb[2];
 633        void                    *ctrl; /* For bnad */
 634        struct bna_pkt_rate pkt_rate;
 635
 636        /* Control path */
 637        struct bna_cq *cq;
 638        struct bnad *bnad;
 639        void                    *priv; /* BNAD's cookie */
 640        enum bna_intr_type intr_type;
 641        int                     intr_vector;
 642        u8                      rx_coalescing_timeo; /* For NAPI */
 643        int                     id;
 644        char                    name[BNA_Q_NAME_SIZE];
 645};
 646
 647/* CQ QPT, configuration  */
 648struct bna_cq {
 649        struct bna_qpt qpt;
 650        struct bna_ccb *ccb;
 651
 652        struct bna_ib ib;
 653
 654        struct bna_rx *rx;
 655};
 656
 657struct bna_rss_config {
 658        enum bfi_enet_rss_type  hash_type;
 659        u8                      hash_mask;
 660        u32             toeplitz_hash_key[BFI_ENET_RSS_KEY_LEN];
 661};
 662
 663struct bna_hds_config {
 664        enum bfi_enet_hds_type  hdr_type;
 665        int                     forced_offset;
 666};
 667
 668/* Rx object configuration used during creation */
 669struct bna_rx_config {
 670        enum bna_rx_type rx_type;
 671        int                     num_paths;
 672        enum bna_rxp_type rxp_type;
 673        int                     paused;
 674        int                     q_depth;
 675        int                     coalescing_timeo;
 676        /*
 677         * Small/Large (or Header/Data) buffer size to be configured
 678         * for SLR and HDS queue type. Large buffer size comes from
 679         * enet->mtu.
 680         */
 681        int                     small_buff_size;
 682
 683        enum bna_status rss_status;
 684        struct bna_rss_config rss_config;
 685
 686        struct bna_hds_config hds_config;
 687
 688        enum bna_status vlan_strip_status;
 689};
 690
 691/* Rx Path structure - one per MSIX vector/CPU */
 692struct bna_rxp {
 693        /* This should be the first one */
 694        struct list_head                        qe;
 695
 696        enum bna_rxp_type type;
 697        union   bna_rxq_u       rxq;
 698        struct bna_cq cq;
 699
 700        struct bna_rx *rx;
 701
 702        /* MSI-x vector number for configuring RSS */
 703        int                     vector;
 704        int                     hw_id;
 705};
 706
 707/* RxF structure (hardware Rx Function) */
 708struct bna_rxf {
 709        bfa_fsm_t               fsm;
 710        enum bna_rxf_flags flags;
 711
 712        struct bfa_msgq_cmd_entry msgq_cmd;
 713        union {
 714                struct bfi_enet_enable_req req;
 715                struct bfi_enet_rss_cfg_req rss_req;
 716                struct bfi_enet_rit_req rit_req;
 717                struct bfi_enet_rx_vlan_req vlan_req;
 718                struct bfi_enet_mcast_add_req mcast_add_req;
 719                struct bfi_enet_mcast_del_req mcast_del_req;
 720                struct bfi_enet_ucast_req ucast_req;
 721        } bfi_enet_cmd;
 722
 723        /* callback for bna_rxf_start() */
 724        void (*start_cbfn) (struct bna_rx *rx);
 725        struct bna_rx *start_cbarg;
 726
 727        /* callback for bna_rxf_stop() */
 728        void (*stop_cbfn) (struct bna_rx *rx);
 729        struct bna_rx *stop_cbarg;
 730
 731        /* callback for bna_rx_receive_pause() / bna_rx_receive_resume() */
 732        void (*oper_state_cbfn) (struct bnad *bnad, struct bna_rx *rx);
 733        struct bnad *oper_state_cbarg;
 734
 735        /**
 736         * callback for:
 737         *      bna_rxf_ucast_set()
 738         *      bna_rxf_{ucast/mcast}_add(),
 739         *      bna_rxf_{ucast/mcast}_del(),
 740         *      bna_rxf_mode_set()
 741         */
 742        void (*cam_fltr_cbfn)(struct bnad *bnad, struct bna_rx *rx);
 743        struct bnad *cam_fltr_cbarg;
 744
 745        /* List of unicast addresses yet to be applied to h/w */
 746        struct list_head                        ucast_pending_add_q;
 747        struct list_head                        ucast_pending_del_q;
 748        struct bna_mac *ucast_pending_mac;
 749        int                     ucast_pending_set;
 750        /* ucast addresses applied to the h/w */
 751        struct list_head                        ucast_active_q;
 752        struct bna_mac ucast_active_mac;
 753        int                     ucast_active_set;
 754
 755        /* List of multicast addresses yet to be applied to h/w */
 756        struct list_head                        mcast_pending_add_q;
 757        struct list_head                        mcast_pending_del_q;
 758        /* multicast addresses applied to the h/w */
 759        struct list_head                        mcast_active_q;
 760        struct list_head                        mcast_handle_q;
 761
 762        /* Rx modes yet to be applied to h/w */
 763        enum bna_rxmode rxmode_pending;
 764        enum bna_rxmode rxmode_pending_bitmask;
 765        /* Rx modes applied to h/w */
 766        enum bna_rxmode rxmode_active;
 767
 768        u8                      vlan_pending_bitmask;
 769        enum bna_status vlan_filter_status;
 770        u32     vlan_filter_table[(BFI_ENET_VLAN_ID_MAX) / 32];
 771        bool                    vlan_strip_pending;
 772        enum bna_status         vlan_strip_status;
 773
 774        enum bna_rss_flags      rss_pending;
 775        enum bna_status         rss_status;
 776        struct bna_rss_config   rss_cfg;
 777        u8                      *rit;
 778        int                     rit_size;
 779
 780        struct bna_rx           *rx;
 781};
 782
 783/* Rx object */
 784struct bna_rx {
 785        /* This should be the first one */
 786        struct list_head                        qe;
 787        int                     rid;
 788        int                     hw_id;
 789
 790        bfa_fsm_t               fsm;
 791
 792        enum bna_rx_type type;
 793
 794        int                     num_paths;
 795        struct list_head                        rxp_q;
 796
 797        struct bna_hds_config   hds_cfg;
 798
 799        struct bna_rxf rxf;
 800
 801        enum bna_rx_flags rx_flags;
 802
 803        struct bfa_msgq_cmd_entry msgq_cmd;
 804        union {
 805                struct bfi_enet_rx_cfg_req      cfg_req;
 806                struct bfi_enet_req             req;
 807                struct bfi_enet_rx_cfg_rsp      cfg_rsp;
 808        } bfi_enet_cmd;
 809
 810        /* Rx event handlers */
 811        void (*rcb_setup_cbfn)(struct bnad *, struct bna_rcb *);
 812        void (*rcb_destroy_cbfn)(struct bnad *, struct bna_rcb *);
 813        void (*ccb_setup_cbfn)(struct bnad *, struct bna_ccb *);
 814        void (*ccb_destroy_cbfn)(struct bnad *, struct bna_ccb *);
 815        void (*rx_stall_cbfn)(struct bnad *, struct bna_rx *);
 816        void (*rx_cleanup_cbfn)(struct bnad *, struct bna_rx *);
 817        void (*rx_post_cbfn)(struct bnad *, struct bna_rx *);
 818
 819        /* callback for bna_rx_disable(), bna_rx_stop() */
 820        void (*stop_cbfn)(void *arg, struct bna_rx *rx);
 821        void                    *stop_cbarg;
 822
 823        struct bna *bna;
 824        void                    *priv; /* bnad's cookie */
 825};
 826
 827struct bna_rx_event_cbfn {
 828        /* Optional */
 829        void (*rcb_setup_cbfn)(struct bnad *, struct bna_rcb *);
 830        void (*rcb_destroy_cbfn)(struct bnad *, struct bna_rcb *);
 831        void (*ccb_setup_cbfn)(struct bnad *, struct bna_ccb *);
 832        void (*ccb_destroy_cbfn)(struct bnad *, struct bna_ccb *);
 833        void (*rx_stall_cbfn)(struct bnad *, struct bna_rx *);
 834        /* Mandatory */
 835        void (*rx_cleanup_cbfn)(struct bnad *, struct bna_rx *);
 836        void (*rx_post_cbfn)(struct bnad *, struct bna_rx *);
 837};
 838
 839/* Rx module - keeps track of free, active rx objects */
 840struct bna_rx_mod {
 841        struct bna *bna;                /* back pointer to parent */
 842        struct bna_rx *rx;              /* BFI_MAX_RXQ entries */
 843        struct bna_rxp *rxp;            /* BFI_MAX_RXQ entries */
 844        struct bna_rxq *rxq;            /* BFI_MAX_RXQ entries */
 845
 846        struct list_head                        rx_free_q;
 847        struct list_head                        rx_active_q;
 848        int                     rx_free_count;
 849
 850        struct list_head                        rxp_free_q;
 851        int                     rxp_free_count;
 852
 853        struct list_head                        rxq_free_q;
 854        int                     rxq_free_count;
 855
 856        enum bna_rx_mod_flags flags;
 857
 858        /* callback for bna_rx_mod_stop() */
 859        void (*stop_cbfn)(struct bna_enet *enet);
 860
 861        struct bfa_wc           rx_stop_wc;
 862        u32             dim_vector[BNA_LOAD_T_MAX][BNA_BIAS_T_MAX];
 863        u32             rid_mask;
 864};
 865
 866/* CAM */
 867
 868struct bna_ucam_mod {
 869        struct bna_mac *ucmac;          /* BFI_MAX_UCMAC entries */
 870        struct list_head                        free_q;
 871
 872        struct bna *bna;
 873};
 874
 875struct bna_mcam_handle {
 876        /* This should be the first one */
 877        struct list_head                        qe;
 878        int                     handle;
 879        int                     refcnt;
 880};
 881
 882struct bna_mcam_mod {
 883        struct bna_mac *mcmac;          /* BFI_MAX_MCMAC entries */
 884        struct bna_mcam_handle *mchandle;       /* BFI_MAX_MCMAC entries */
 885        struct list_head                        free_q;
 886        struct list_head                        free_handle_q;
 887
 888        struct bna *bna;
 889};
 890
 891/* Statistics */
 892
 893struct bna_stats {
 894        struct bna_dma_addr     hw_stats_dma;
 895        struct bfi_enet_stats   *hw_stats_kva;
 896        struct bfi_enet_stats   hw_stats;
 897};
 898
 899struct bna_stats_mod {
 900        bool            ioc_ready;
 901        bool            stats_get_busy;
 902        bool            stats_clr_busy;
 903        struct bfa_msgq_cmd_entry stats_get_cmd;
 904        struct bfa_msgq_cmd_entry stats_clr_cmd;
 905        struct bfi_enet_stats_req stats_get;
 906        struct bfi_enet_stats_req stats_clr;
 907};
 908
 909/* BNA */
 910
 911struct bna {
 912        struct bna_ident ident;
 913        struct bfa_pcidev pcidev;
 914
 915        struct bna_reg regs;
 916        struct bna_bit_defn bits;
 917
 918        struct bna_stats stats;
 919
 920        struct bna_ioceth ioceth;
 921        struct bfa_cee cee;
 922        struct bfa_flash flash;
 923        struct bfa_msgq msgq;
 924
 925        struct bna_ethport ethport;
 926        struct bna_enet enet;
 927        struct bna_stats_mod stats_mod;
 928
 929        struct bna_tx_mod tx_mod;
 930        struct bna_rx_mod rx_mod;
 931        struct bna_ucam_mod ucam_mod;
 932        struct bna_mcam_mod mcam_mod;
 933
 934        enum bna_mod_flags mod_flags;
 935
 936        int                     default_mode_rid;
 937        int                     promisc_rid;
 938
 939        struct bnad *bnad;
 940};
 941#endif  /* __BNA_TYPES_H__ */
 942