linux/drivers/net/ethernet/brocade/bna/bfi_enet.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
  12/* BNA Hardware and Firmware Interface */
  13
  14/* Skipping statistics collection to avoid clutter.
  15 * Command is no longer needed:
  16 *      MTU
  17 *      TxQ Stop
  18 *      RxQ Stop
  19 *      RxF Enable/Disable
  20 *
  21 * HDS-off request is dynamic
  22 * keep structures as multiple of 32-bit fields for alignment.
  23 * All values must be written in big-endian.
  24 */
  25#ifndef __BFI_ENET_H__
  26#define __BFI_ENET_H__
  27
  28#include "bfa_defs.h"
  29#include "bfi.h"
  30
  31#define BFI_ENET_CFG_MAX                32      /* Max resources per PF */
  32
  33#define BFI_ENET_TXQ_PRIO_MAX           8
  34#define BFI_ENET_RX_QSET_MAX            16
  35#define BFI_ENET_TXQ_WI_VECT_MAX        4
  36
  37#define BFI_ENET_VLAN_ID_MAX            4096
  38#define BFI_ENET_VLAN_BLOCK_SIZE        512     /* in bits */
  39#define BFI_ENET_VLAN_BLOCKS_MAX                                        \
  40        (BFI_ENET_VLAN_ID_MAX / BFI_ENET_VLAN_BLOCK_SIZE)
  41#define BFI_ENET_VLAN_WORD_SIZE         32      /* in bits */
  42#define BFI_ENET_VLAN_WORDS_MAX                                         \
  43        (BFI_ENET_VLAN_BLOCK_SIZE / BFI_ENET_VLAN_WORD_SIZE)
  44
  45#define BFI_ENET_RSS_RIT_MAX            64      /* entries */
  46#define BFI_ENET_RSS_KEY_LEN            10      /* 32-bit words */
  47
  48union bfi_addr_be_u {
  49        struct {
  50                u32     addr_hi;        /* Most Significant 32-bits */
  51                u32     addr_lo;        /* Least Significant 32-Bits */
  52        } __packed a32;
  53} __packed;
  54
  55/*      T X   Q U E U E   D E F I N E S      */
  56/* TxQ Vector (a.k.a. Tx-Buffer Descriptor) */
  57/* TxQ Entry Opcodes */
  58#define BFI_ENET_TXQ_WI_SEND            (0x402) /* Single Frame Transmission */
  59#define BFI_ENET_TXQ_WI_SEND_LSO        (0x403) /* Multi-Frame Transmission */
  60#define BFI_ENET_TXQ_WI_EXTENSION       (0x104) /* Extension WI */
  61
  62/* TxQ Entry Control Flags */
  63#define BFI_ENET_TXQ_WI_CF_FCOE_CRC     BIT(8)
  64#define BFI_ENET_TXQ_WI_CF_IPID_MODE    BIT(5)
  65#define BFI_ENET_TXQ_WI_CF_INS_PRIO     BIT(4)
  66#define BFI_ENET_TXQ_WI_CF_INS_VLAN     BIT(3)
  67#define BFI_ENET_TXQ_WI_CF_UDP_CKSUM    BIT(2)
  68#define BFI_ENET_TXQ_WI_CF_TCP_CKSUM    BIT(1)
  69#define BFI_ENET_TXQ_WI_CF_IP_CKSUM     BIT(0)
  70
  71struct bfi_enet_txq_wi_base {
  72        u8                      reserved;
  73        u8                      num_vectors;    /* number of vectors present */
  74        u16                     opcode;
  75                        /* BFI_ENET_TXQ_WI_SEND or BFI_ENET_TXQ_WI_SEND_LSO */
  76        u16                     flags;          /* OR of all the flags */
  77        u16                     l4_hdr_size_n_offset;
  78        u16                     vlan_tag;
  79        u16                     lso_mss;        /* Only 14 LSB are valid */
  80        u32                     frame_length;   /* Only 24 LSB are valid */
  81} __packed;
  82
  83struct bfi_enet_txq_wi_ext {
  84        u16                     reserved;
  85        u16                     opcode;         /* BFI_ENET_TXQ_WI_EXTENSION */
  86        u32                     reserved2[3];
  87} __packed;
  88
  89struct bfi_enet_txq_wi_vector {                 /* Tx Buffer Descriptor */
  90        u16                     reserved;
  91        u16                     length;         /* Only 14 LSB are valid */
  92        union bfi_addr_be_u     addr;
  93} __packed;
  94
  95/*  TxQ Entry Structure  */
  96struct bfi_enet_txq_entry {
  97        union {
  98                struct bfi_enet_txq_wi_base     base;
  99                struct bfi_enet_txq_wi_ext      ext;
 100        } __packed wi;
 101        struct bfi_enet_txq_wi_vector vector[BFI_ENET_TXQ_WI_VECT_MAX];
 102} __packed;
 103
 104#define wi_hdr          wi.base
 105#define wi_ext_hdr      wi.ext
 106
 107#define BFI_ENET_TXQ_WI_L4_HDR_N_OFFSET(_hdr_size, _offset) \
 108                (((_hdr_size) << 10) | ((_offset) & 0x3FF))
 109
 110/*   R X   Q U E U E   D E F I N E S   */
 111struct bfi_enet_rxq_entry {
 112        union bfi_addr_be_u  rx_buffer;
 113} __packed;
 114
 115/*   R X   C O M P L E T I O N   Q U E U E   D E F I N E S   */
 116/* CQ Entry Flags */
 117#define BFI_ENET_CQ_EF_MAC_ERROR        BIT(0)
 118#define BFI_ENET_CQ_EF_FCS_ERROR        BIT(1)
 119#define BFI_ENET_CQ_EF_TOO_LONG         BIT(2)
 120#define BFI_ENET_CQ_EF_FC_CRC_OK        BIT(3)
 121
 122#define BFI_ENET_CQ_EF_RSVD1            BIT(4)
 123#define BFI_ENET_CQ_EF_L4_CKSUM_OK      BIT(5)
 124#define BFI_ENET_CQ_EF_L3_CKSUM_OK      BIT(6)
 125#define BFI_ENET_CQ_EF_HDS_HEADER       BIT(7)
 126
 127#define BFI_ENET_CQ_EF_UDP              BIT(8)
 128#define BFI_ENET_CQ_EF_TCP              BIT(9)
 129#define BFI_ENET_CQ_EF_IP_OPTIONS       BIT(10)
 130#define BFI_ENET_CQ_EF_IPV6             BIT(11)
 131
 132#define BFI_ENET_CQ_EF_IPV4             BIT(12)
 133#define BFI_ENET_CQ_EF_VLAN             BIT(13)
 134#define BFI_ENET_CQ_EF_RSS              BIT(14)
 135#define BFI_ENET_CQ_EF_RSVD2            BIT(15)
 136
 137#define BFI_ENET_CQ_EF_MCAST_MATCH      BIT(16)
 138#define BFI_ENET_CQ_EF_MCAST            BIT(17)
 139#define BFI_ENET_CQ_EF_BCAST            BIT(18)
 140#define BFI_ENET_CQ_EF_REMOTE           BIT(19)
 141
 142#define BFI_ENET_CQ_EF_LOCAL            BIT(20)
 143
 144/* CQ Entry Structure */
 145struct bfi_enet_cq_entry {
 146        u32 flags;
 147        u16     vlan_tag;
 148        u16     length;
 149        u32     rss_hash;
 150        u8      valid;
 151        u8      reserved1;
 152        u8      reserved2;
 153        u8      rxq_id;
 154} __packed;
 155
 156/*   E N E T   C O N T R O L   P A T H   C O M M A N D S   */
 157struct bfi_enet_q {
 158        union bfi_addr_u        pg_tbl;
 159        union bfi_addr_u        first_entry;
 160        u16             pages;  /* # of pages */
 161        u16             page_sz;
 162} __packed;
 163
 164struct bfi_enet_txq {
 165        struct bfi_enet_q       q;
 166        u8                      priority;
 167        u8                      rsvd[3];
 168} __packed;
 169
 170struct bfi_enet_rxq {
 171        struct bfi_enet_q       q;
 172        u16             rx_buffer_size;
 173        u16             rsvd;
 174} __packed;
 175
 176struct bfi_enet_cq {
 177        struct bfi_enet_q       q;
 178} __packed;
 179
 180struct bfi_enet_ib_cfg {
 181        u8              int_pkt_dma;
 182        u8              int_enabled;
 183        u8              int_pkt_enabled;
 184        u8              continuous_coalescing;
 185        u8              msix;
 186        u8              rsvd[3];
 187        u32     coalescing_timeout;
 188        u32     inter_pkt_timeout;
 189        u8              inter_pkt_count;
 190        u8              rsvd1[3];
 191} __packed;
 192
 193struct bfi_enet_ib {
 194        union bfi_addr_u        index_addr;
 195        union {
 196                u16     msix_index;
 197                u16     intx_bitmask;
 198        } __packed intr;
 199        u16             rsvd;
 200} __packed;
 201
 202/* ENET command messages */
 203enum bfi_enet_h2i_msgs {
 204        /* Rx Commands */
 205        BFI_ENET_H2I_RX_CFG_SET_REQ = 1,
 206        BFI_ENET_H2I_RX_CFG_CLR_REQ = 2,
 207
 208        BFI_ENET_H2I_RIT_CFG_REQ = 3,
 209        BFI_ENET_H2I_RSS_CFG_REQ = 4,
 210        BFI_ENET_H2I_RSS_ENABLE_REQ = 5,
 211        BFI_ENET_H2I_RX_PROMISCUOUS_REQ = 6,
 212        BFI_ENET_H2I_RX_DEFAULT_REQ = 7,
 213
 214        BFI_ENET_H2I_MAC_UCAST_SET_REQ = 8,
 215        BFI_ENET_H2I_MAC_UCAST_CLR_REQ = 9,
 216        BFI_ENET_H2I_MAC_UCAST_ADD_REQ = 10,
 217        BFI_ENET_H2I_MAC_UCAST_DEL_REQ = 11,
 218
 219        BFI_ENET_H2I_MAC_MCAST_ADD_REQ = 12,
 220        BFI_ENET_H2I_MAC_MCAST_DEL_REQ = 13,
 221        BFI_ENET_H2I_MAC_MCAST_FILTER_REQ = 14,
 222
 223        BFI_ENET_H2I_RX_VLAN_SET_REQ = 15,
 224        BFI_ENET_H2I_RX_VLAN_STRIP_ENABLE_REQ = 16,
 225
 226        /* Tx Commands */
 227        BFI_ENET_H2I_TX_CFG_SET_REQ = 17,
 228        BFI_ENET_H2I_TX_CFG_CLR_REQ = 18,
 229
 230        /* Port Commands */
 231        BFI_ENET_H2I_PORT_ADMIN_UP_REQ = 19,
 232        BFI_ENET_H2I_SET_PAUSE_REQ = 20,
 233        BFI_ENET_H2I_DIAG_LOOPBACK_REQ = 21,
 234
 235        /* Get Attributes Command */
 236        BFI_ENET_H2I_GET_ATTR_REQ = 22,
 237
 238        /*  Statistics Commands */
 239        BFI_ENET_H2I_STATS_GET_REQ = 23,
 240        BFI_ENET_H2I_STATS_CLR_REQ = 24,
 241
 242        BFI_ENET_H2I_WOL_MAGIC_REQ = 25,
 243        BFI_ENET_H2I_WOL_FRAME_REQ = 26,
 244
 245        BFI_ENET_H2I_MAX = 27,
 246};
 247
 248enum bfi_enet_i2h_msgs {
 249        /* Rx Responses */
 250        BFI_ENET_I2H_RX_CFG_SET_RSP =
 251                BFA_I2HM(BFI_ENET_H2I_RX_CFG_SET_REQ),
 252        BFI_ENET_I2H_RX_CFG_CLR_RSP =
 253                BFA_I2HM(BFI_ENET_H2I_RX_CFG_CLR_REQ),
 254
 255        BFI_ENET_I2H_RIT_CFG_RSP =
 256                BFA_I2HM(BFI_ENET_H2I_RIT_CFG_REQ),
 257        BFI_ENET_I2H_RSS_CFG_RSP =
 258                BFA_I2HM(BFI_ENET_H2I_RSS_CFG_REQ),
 259        BFI_ENET_I2H_RSS_ENABLE_RSP =
 260                BFA_I2HM(BFI_ENET_H2I_RSS_ENABLE_REQ),
 261        BFI_ENET_I2H_RX_PROMISCUOUS_RSP =
 262                BFA_I2HM(BFI_ENET_H2I_RX_PROMISCUOUS_REQ),
 263        BFI_ENET_I2H_RX_DEFAULT_RSP =
 264                BFA_I2HM(BFI_ENET_H2I_RX_DEFAULT_REQ),
 265
 266        BFI_ENET_I2H_MAC_UCAST_SET_RSP =
 267                BFA_I2HM(BFI_ENET_H2I_MAC_UCAST_SET_REQ),
 268        BFI_ENET_I2H_MAC_UCAST_CLR_RSP =
 269                BFA_I2HM(BFI_ENET_H2I_MAC_UCAST_CLR_REQ),
 270        BFI_ENET_I2H_MAC_UCAST_ADD_RSP =
 271                BFA_I2HM(BFI_ENET_H2I_MAC_UCAST_ADD_REQ),
 272        BFI_ENET_I2H_MAC_UCAST_DEL_RSP =
 273                BFA_I2HM(BFI_ENET_H2I_MAC_UCAST_DEL_REQ),
 274
 275        BFI_ENET_I2H_MAC_MCAST_ADD_RSP =
 276                BFA_I2HM(BFI_ENET_H2I_MAC_MCAST_ADD_REQ),
 277        BFI_ENET_I2H_MAC_MCAST_DEL_RSP =
 278                BFA_I2HM(BFI_ENET_H2I_MAC_MCAST_DEL_REQ),
 279        BFI_ENET_I2H_MAC_MCAST_FILTER_RSP =
 280                BFA_I2HM(BFI_ENET_H2I_MAC_MCAST_FILTER_REQ),
 281
 282        BFI_ENET_I2H_RX_VLAN_SET_RSP =
 283                BFA_I2HM(BFI_ENET_H2I_RX_VLAN_SET_REQ),
 284
 285        BFI_ENET_I2H_RX_VLAN_STRIP_ENABLE_RSP =
 286                BFA_I2HM(BFI_ENET_H2I_RX_VLAN_STRIP_ENABLE_REQ),
 287
 288        /* Tx Responses */
 289        BFI_ENET_I2H_TX_CFG_SET_RSP =
 290                BFA_I2HM(BFI_ENET_H2I_TX_CFG_SET_REQ),
 291        BFI_ENET_I2H_TX_CFG_CLR_RSP =
 292                BFA_I2HM(BFI_ENET_H2I_TX_CFG_CLR_REQ),
 293
 294        /* Port Responses */
 295        BFI_ENET_I2H_PORT_ADMIN_RSP =
 296                BFA_I2HM(BFI_ENET_H2I_PORT_ADMIN_UP_REQ),
 297
 298        BFI_ENET_I2H_SET_PAUSE_RSP =
 299                BFA_I2HM(BFI_ENET_H2I_SET_PAUSE_REQ),
 300        BFI_ENET_I2H_DIAG_LOOPBACK_RSP =
 301                BFA_I2HM(BFI_ENET_H2I_DIAG_LOOPBACK_REQ),
 302
 303        /*  Attributes Response */
 304        BFI_ENET_I2H_GET_ATTR_RSP =
 305                BFA_I2HM(BFI_ENET_H2I_GET_ATTR_REQ),
 306
 307        /* Statistics Responses */
 308        BFI_ENET_I2H_STATS_GET_RSP =
 309                BFA_I2HM(BFI_ENET_H2I_STATS_GET_REQ),
 310        BFI_ENET_I2H_STATS_CLR_RSP =
 311                BFA_I2HM(BFI_ENET_H2I_STATS_CLR_REQ),
 312
 313        BFI_ENET_I2H_WOL_MAGIC_RSP =
 314                BFA_I2HM(BFI_ENET_H2I_WOL_MAGIC_REQ),
 315        BFI_ENET_I2H_WOL_FRAME_RSP =
 316                BFA_I2HM(BFI_ENET_H2I_WOL_FRAME_REQ),
 317
 318        /* AENs */
 319        BFI_ENET_I2H_LINK_DOWN_AEN = BFA_I2HM(BFI_ENET_H2I_MAX),
 320        BFI_ENET_I2H_LINK_UP_AEN = BFA_I2HM(BFI_ENET_H2I_MAX + 1),
 321
 322        BFI_ENET_I2H_PORT_ENABLE_AEN = BFA_I2HM(BFI_ENET_H2I_MAX + 2),
 323        BFI_ENET_I2H_PORT_DISABLE_AEN = BFA_I2HM(BFI_ENET_H2I_MAX + 3),
 324
 325        BFI_ENET_I2H_BW_UPDATE_AEN = BFA_I2HM(BFI_ENET_H2I_MAX + 4),
 326};
 327
 328/* The following error codes can be returned by the enet commands */
 329enum bfi_enet_err {
 330        BFI_ENET_CMD_OK         = 0,
 331        BFI_ENET_CMD_FAIL       = 1,
 332        BFI_ENET_CMD_DUP_ENTRY  = 2,    /* !< Duplicate entry in CAM */
 333        BFI_ENET_CMD_CAM_FULL   = 3,    /* !< CAM is full */
 334        BFI_ENET_CMD_NOT_OWNER  = 4,    /* !< Not permitted, b'cos not owner */
 335        BFI_ENET_CMD_NOT_EXEC   = 5,    /* !< Was not sent to f/w at all */
 336        BFI_ENET_CMD_WAITING    = 6,    /* !< Waiting for completion */
 337        BFI_ENET_CMD_PORT_DISABLED = 7, /* !< port in disabled state */
 338};
 339
 340/* Generic Request
 341 *
 342 * bfi_enet_req is used by:
 343 *      BFI_ENET_H2I_RX_CFG_CLR_REQ
 344 *      BFI_ENET_H2I_TX_CFG_CLR_REQ
 345 */
 346struct bfi_enet_req {
 347        struct bfi_msgq_mhdr mh;
 348} __packed;
 349
 350/* Enable/Disable Request
 351 *
 352 * bfi_enet_enable_req is used by:
 353 *      BFI_ENET_H2I_RSS_ENABLE_REQ     (enet_id must be zero)
 354 *      BFI_ENET_H2I_RX_PROMISCUOUS_REQ (enet_id must be zero)
 355 *      BFI_ENET_H2I_RX_DEFAULT_REQ     (enet_id must be zero)
 356 *      BFI_ENET_H2I_RX_MAC_MCAST_FILTER_REQ
 357 *      BFI_ENET_H2I_PORT_ADMIN_UP_REQ  (enet_id must be zero)
 358 */
 359struct bfi_enet_enable_req {
 360        struct          bfi_msgq_mhdr mh;
 361        u8              enable;         /* 1 = enable;  0 = disable */
 362        u8              rsvd[3];
 363} __packed;
 364
 365/* Generic Response */
 366struct bfi_enet_rsp {
 367        struct bfi_msgq_mhdr mh;
 368        u8              error;          /*!< if error see cmd_offset */
 369        u8              rsvd;
 370        u16             cmd_offset;     /*!< offset to invalid parameter */
 371} __packed;
 372
 373/* GLOBAL CONFIGURATION */
 374
 375/* bfi_enet_attr_req is used by:
 376 *      BFI_ENET_H2I_GET_ATTR_REQ
 377 */
 378struct bfi_enet_attr_req {
 379        struct bfi_msgq_mhdr    mh;
 380} __packed;
 381
 382/* bfi_enet_attr_rsp is used by:
 383 *      BFI_ENET_I2H_GET_ATTR_RSP
 384 */
 385struct bfi_enet_attr_rsp {
 386        struct bfi_msgq_mhdr mh;
 387        u8              error;          /*!< if error see cmd_offset */
 388        u8              rsvd;
 389        u16             cmd_offset;     /*!< offset to invalid parameter */
 390        u32             max_cfg;
 391        u32             max_ucmac;
 392        u32             rit_size;
 393} __packed;
 394
 395/* Tx Configuration
 396 *
 397 * bfi_enet_tx_cfg is used by:
 398 *      BFI_ENET_H2I_TX_CFG_SET_REQ
 399 */
 400enum bfi_enet_tx_vlan_mode {
 401        BFI_ENET_TX_VLAN_NOP    = 0,
 402        BFI_ENET_TX_VLAN_INS    = 1,
 403        BFI_ENET_TX_VLAN_WI     = 2,
 404};
 405
 406struct bfi_enet_tx_cfg {
 407        u8              vlan_mode;      /*!< processing mode */
 408        u8              rsvd;
 409        u16             vlan_id;
 410        u8              admit_tagged_frame;
 411        u8              apply_vlan_filter;
 412        u8              add_to_vswitch;
 413        u8              rsvd1[1];
 414} __packed;
 415
 416struct bfi_enet_tx_cfg_req {
 417        struct bfi_msgq_mhdr mh;
 418        u8                      num_queues;     /* # of Tx Queues */
 419        u8                      rsvd[3];
 420
 421        struct {
 422                struct bfi_enet_txq     q;
 423                struct bfi_enet_ib      ib;
 424        } __packed q_cfg[BFI_ENET_TXQ_PRIO_MAX];
 425
 426        struct bfi_enet_ib_cfg  ib_cfg;
 427
 428        struct bfi_enet_tx_cfg  tx_cfg;
 429};
 430
 431struct bfi_enet_tx_cfg_rsp {
 432        struct          bfi_msgq_mhdr mh;
 433        u8              error;
 434        u8              hw_id;          /* For debugging */
 435        u8              rsvd[2];
 436        struct {
 437                u32     q_dbell;        /* PCI base address offset */
 438                u32     i_dbell;        /* PCI base address offset */
 439                u8      hw_qid;         /* For debugging */
 440                u8      rsvd[3];
 441        } __packed q_handles[BFI_ENET_TXQ_PRIO_MAX];
 442};
 443
 444/* Rx Configuration
 445 *
 446 * bfi_enet_rx_cfg is used by:
 447 *      BFI_ENET_H2I_RX_CFG_SET_REQ
 448 */
 449enum bfi_enet_rxq_type {
 450        BFI_ENET_RXQ_SINGLE             = 1,
 451        BFI_ENET_RXQ_LARGE_SMALL        = 2,
 452        BFI_ENET_RXQ_HDS                = 3,
 453        BFI_ENET_RXQ_HDS_OPT_BASED      = 4,
 454};
 455
 456enum bfi_enet_hds_type {
 457        BFI_ENET_HDS_FORCED     = 0x01,
 458        BFI_ENET_HDS_IPV6_UDP   = 0x02,
 459        BFI_ENET_HDS_IPV6_TCP   = 0x04,
 460        BFI_ENET_HDS_IPV4_TCP   = 0x08,
 461        BFI_ENET_HDS_IPV4_UDP   = 0x10,
 462};
 463
 464struct bfi_enet_rx_cfg {
 465        u8              rxq_type;
 466        u8              rsvd[1];
 467        u16             frame_size;
 468
 469        struct {
 470                u8                      max_header_size;
 471                u8                      force_offset;
 472                u8                      type;
 473                u8                      rsvd1;
 474        } __packed hds;
 475
 476        u8              multi_buffer;
 477        u8              strip_vlan;
 478        u8              drop_untagged;
 479        u8              rsvd2;
 480} __packed;
 481
 482/*
 483 * Multicast frames are received on the ql of q-set index zero.
 484 * On the completion queue.  RxQ ID = even is for large/data buffer queues
 485 * and RxQ ID = odd is for small/header buffer queues.
 486 */
 487struct bfi_enet_rx_cfg_req {
 488        struct bfi_msgq_mhdr mh;
 489        u8                      num_queue_sets; /* # of Rx Queue Sets */
 490        u8                      rsvd[3];
 491
 492        struct {
 493                struct bfi_enet_rxq     ql;     /* large/data/single buffers */
 494                struct bfi_enet_rxq     qs;     /* small/header buffers */
 495                struct bfi_enet_cq      cq;
 496                struct bfi_enet_ib      ib;
 497        } __packed q_cfg[BFI_ENET_RX_QSET_MAX];
 498
 499        struct bfi_enet_ib_cfg  ib_cfg;
 500
 501        struct bfi_enet_rx_cfg  rx_cfg;
 502} __packed;
 503
 504struct bfi_enet_rx_cfg_rsp {
 505        struct bfi_msgq_mhdr mh;
 506        u8              error;
 507        u8              hw_id;   /* For debugging */
 508        u8              rsvd[2];
 509        struct {
 510                u32     ql_dbell; /* PCI base address offset */
 511                u32     qs_dbell; /* PCI base address offset */
 512                u32     i_dbell;  /* PCI base address offset */
 513                u8              hw_lqid;  /* For debugging */
 514                u8              hw_sqid;  /* For debugging */
 515                u8              hw_cqid;  /* For debugging */
 516                u8              rsvd;
 517        } __packed q_handles[BFI_ENET_RX_QSET_MAX];
 518} __packed;
 519
 520/* RIT
 521 *
 522 * bfi_enet_rit_req is used by:
 523 *      BFI_ENET_H2I_RIT_CFG_REQ
 524 */
 525struct bfi_enet_rit_req {
 526        struct  bfi_msgq_mhdr mh;
 527        u16     size;                   /* number of table-entries used */
 528        u8      rsvd[2];
 529        u8      table[BFI_ENET_RSS_RIT_MAX];
 530} __packed;
 531
 532/* RSS
 533 *
 534 * bfi_enet_rss_cfg_req is used by:
 535 *      BFI_ENET_H2I_RSS_CFG_REQ
 536 */
 537enum bfi_enet_rss_type {
 538        BFI_ENET_RSS_IPV6       = 0x01,
 539        BFI_ENET_RSS_IPV6_TCP   = 0x02,
 540        BFI_ENET_RSS_IPV4       = 0x04,
 541        BFI_ENET_RSS_IPV4_TCP   = 0x08
 542};
 543
 544struct bfi_enet_rss_cfg {
 545        u8      type;
 546        u8      mask;
 547        u8      rsvd[2];
 548        u32     key[BFI_ENET_RSS_KEY_LEN];
 549} __packed;
 550
 551struct bfi_enet_rss_cfg_req {
 552        struct bfi_msgq_mhdr    mh;
 553        struct bfi_enet_rss_cfg cfg;
 554} __packed;
 555
 556/* MAC Unicast
 557 *
 558 * bfi_enet_rx_vlan_req is used by:
 559 *      BFI_ENET_H2I_MAC_UCAST_SET_REQ
 560 *      BFI_ENET_H2I_MAC_UCAST_CLR_REQ
 561 *      BFI_ENET_H2I_MAC_UCAST_ADD_REQ
 562 *      BFI_ENET_H2I_MAC_UCAST_DEL_REQ
 563 */
 564struct bfi_enet_ucast_req {
 565        struct bfi_msgq_mhdr    mh;
 566        u8                      mac_addr[ETH_ALEN];
 567        u8                      rsvd[2];
 568} __packed;
 569
 570/* MAC Unicast + VLAN */
 571struct bfi_enet_mac_n_vlan_req {
 572        struct bfi_msgq_mhdr    mh;
 573        u16                     vlan_id;
 574        u8                      mac_addr[ETH_ALEN];
 575} __packed;
 576
 577/* MAC Multicast
 578 *
 579 * bfi_enet_mac_mfilter_add_req is used by:
 580 *      BFI_ENET_H2I_MAC_MCAST_ADD_REQ
 581 */
 582struct bfi_enet_mcast_add_req {
 583        struct bfi_msgq_mhdr    mh;
 584        u8                      mac_addr[ETH_ALEN];
 585        u8                      rsvd[2];
 586} __packed;
 587
 588/* bfi_enet_mac_mfilter_add_rsp is used by:
 589 *      BFI_ENET_I2H_MAC_MCAST_ADD_RSP
 590 */
 591struct bfi_enet_mcast_add_rsp {
 592        struct bfi_msgq_mhdr    mh;
 593        u8                      error;
 594        u8                      rsvd;
 595        u16                     cmd_offset;
 596        u16                     handle;
 597        u8                      rsvd1[2];
 598} __packed;
 599
 600/* bfi_enet_mac_mfilter_del_req is used by:
 601 *      BFI_ENET_H2I_MAC_MCAST_DEL_REQ
 602 */
 603struct bfi_enet_mcast_del_req {
 604        struct bfi_msgq_mhdr    mh;
 605        u16                     handle;
 606        u8                      rsvd[2];
 607} __packed;
 608
 609/* VLAN
 610 *
 611 * bfi_enet_rx_vlan_req is used by:
 612 *      BFI_ENET_H2I_RX_VLAN_SET_REQ
 613 */
 614struct bfi_enet_rx_vlan_req {
 615        struct bfi_msgq_mhdr    mh;
 616        u8                      block_idx;
 617        u8                      rsvd[3];
 618        u32                     bit_mask[BFI_ENET_VLAN_WORDS_MAX];
 619} __packed;
 620
 621/* PAUSE
 622 *
 623 * bfi_enet_set_pause_req is used by:
 624 *      BFI_ENET_H2I_SET_PAUSE_REQ
 625 */
 626struct bfi_enet_set_pause_req {
 627        struct bfi_msgq_mhdr    mh;
 628        u8                      rsvd[2];
 629        u8                      tx_pause;       /* 1 = enable;  0 = disable */
 630        u8                      rx_pause;       /* 1 = enable;  0 = disable */
 631} __packed;
 632
 633/* DIAGNOSTICS
 634 *
 635 * bfi_enet_diag_lb_req is used by:
 636 *      BFI_ENET_H2I_DIAG_LOOPBACK
 637 */
 638struct bfi_enet_diag_lb_req {
 639        struct bfi_msgq_mhdr    mh;
 640        u8                      rsvd[2];
 641        u8                      mode;           /* cable or Serdes */
 642        u8                      enable;         /* 1 = enable;  0 = disable */
 643} __packed;
 644
 645/* enum for Loopback opmodes */
 646enum {
 647        BFI_ENET_DIAG_LB_OPMODE_EXT = 0,
 648        BFI_ENET_DIAG_LB_OPMODE_CBL = 1,
 649};
 650
 651/* STATISTICS
 652 *
 653 * bfi_enet_stats_req is used by:
 654 *    BFI_ENET_H2I_STATS_GET_REQ
 655 *    BFI_ENET_I2H_STATS_CLR_REQ
 656 */
 657struct bfi_enet_stats_req {
 658        struct bfi_msgq_mhdr    mh;
 659        u16                     stats_mask;
 660        u8                      rsvd[2];
 661        u32                     rx_enet_mask;
 662        u32                     tx_enet_mask;
 663        union bfi_addr_u        host_buffer;
 664} __packed;
 665
 666/* defines for "stats_mask" above. */
 667#define BFI_ENET_STATS_MAC    BIT(0)    /* !< MAC Statistics */
 668#define BFI_ENET_STATS_BPC    BIT(1)    /* !< Pause Stats from BPC */
 669#define BFI_ENET_STATS_RAD    BIT(2)    /* !< Rx Admission Statistics */
 670#define BFI_ENET_STATS_RX_FC  BIT(3)    /* !< Rx FC Stats from RxA */
 671#define BFI_ENET_STATS_TX_FC  BIT(4)    /* !< Tx FC Stats from TxA */
 672
 673#define BFI_ENET_STATS_ALL    0x1f
 674
 675/* TxF Frame Statistics */
 676struct bfi_enet_stats_txf {
 677        u64 ucast_octets;
 678        u64 ucast;
 679        u64 ucast_vlan;
 680
 681        u64 mcast_octets;
 682        u64 mcast;
 683        u64 mcast_vlan;
 684
 685        u64 bcast_octets;
 686        u64 bcast;
 687        u64 bcast_vlan;
 688
 689        u64 errors;
 690        u64 filter_vlan;      /* frames filtered due to VLAN */
 691        u64 filter_mac_sa;    /* frames filtered due to SA check */
 692} __packed;
 693
 694/* RxF Frame Statistics */
 695struct bfi_enet_stats_rxf {
 696        u64 ucast_octets;
 697        u64 ucast;
 698        u64 ucast_vlan;
 699
 700        u64 mcast_octets;
 701        u64 mcast;
 702        u64 mcast_vlan;
 703
 704        u64 bcast_octets;
 705        u64 bcast;
 706        u64 bcast_vlan;
 707        u64 frame_drops;
 708} __packed;
 709
 710/* FC Tx Frame Statistics */
 711struct bfi_enet_stats_fc_tx {
 712        u64 txf_ucast_octets;
 713        u64 txf_ucast;
 714        u64 txf_ucast_vlan;
 715
 716        u64 txf_mcast_octets;
 717        u64 txf_mcast;
 718        u64 txf_mcast_vlan;
 719
 720        u64 txf_bcast_octets;
 721        u64 txf_bcast;
 722        u64 txf_bcast_vlan;
 723
 724        u64 txf_parity_errors;
 725        u64 txf_timeout;
 726        u64 txf_fid_parity_errors;
 727} __packed;
 728
 729/* FC Rx Frame Statistics */
 730struct bfi_enet_stats_fc_rx {
 731        u64 rxf_ucast_octets;
 732        u64 rxf_ucast;
 733        u64 rxf_ucast_vlan;
 734
 735        u64 rxf_mcast_octets;
 736        u64 rxf_mcast;
 737        u64 rxf_mcast_vlan;
 738
 739        u64 rxf_bcast_octets;
 740        u64 rxf_bcast;
 741        u64 rxf_bcast_vlan;
 742} __packed;
 743
 744/* RAD Frame Statistics */
 745struct bfi_enet_stats_rad {
 746        u64 rx_frames;
 747        u64 rx_octets;
 748        u64 rx_vlan_frames;
 749
 750        u64 rx_ucast;
 751        u64 rx_ucast_octets;
 752        u64 rx_ucast_vlan;
 753
 754        u64 rx_mcast;
 755        u64 rx_mcast_octets;
 756        u64 rx_mcast_vlan;
 757
 758        u64 rx_bcast;
 759        u64 rx_bcast_octets;
 760        u64 rx_bcast_vlan;
 761
 762        u64 rx_drops;
 763} __packed;
 764
 765/* BPC Tx Registers */
 766struct bfi_enet_stats_bpc {
 767        /* transmit stats */
 768        u64 tx_pause[8];
 769        u64 tx_zero_pause[8];   /*!< Pause cancellation */
 770        /*!<Pause initiation rather than retention */
 771        u64 tx_first_pause[8];
 772
 773        /* receive stats */
 774        u64 rx_pause[8];
 775        u64 rx_zero_pause[8];   /*!< Pause cancellation */
 776        /*!<Pause initiation rather than retention */
 777        u64 rx_first_pause[8];
 778} __packed;
 779
 780/* MAC Rx Statistics */
 781struct bfi_enet_stats_mac {
 782        u64 stats_clr_cnt;      /* times this stats cleared */
 783        u64 frame_64;           /* both rx and tx counter */
 784        u64 frame_65_127;               /* both rx and tx counter */
 785        u64 frame_128_255;              /* both rx and tx counter */
 786        u64 frame_256_511;              /* both rx and tx counter */
 787        u64 frame_512_1023;     /* both rx and tx counter */
 788        u64 frame_1024_1518;    /* both rx and tx counter */
 789        u64 frame_1519_1522;    /* both rx and tx counter */
 790
 791        /* receive stats */
 792        u64 rx_bytes;
 793        u64 rx_packets;
 794        u64 rx_fcs_error;
 795        u64 rx_multicast;
 796        u64 rx_broadcast;
 797        u64 rx_control_frames;
 798        u64 rx_pause;
 799        u64 rx_unknown_opcode;
 800        u64 rx_alignment_error;
 801        u64 rx_frame_length_error;
 802        u64 rx_code_error;
 803        u64 rx_carrier_sense_error;
 804        u64 rx_undersize;
 805        u64 rx_oversize;
 806        u64 rx_fragments;
 807        u64 rx_jabber;
 808        u64 rx_drop;
 809
 810        /* transmit stats */
 811        u64 tx_bytes;
 812        u64 tx_packets;
 813        u64 tx_multicast;
 814        u64 tx_broadcast;
 815        u64 tx_pause;
 816        u64 tx_deferral;
 817        u64 tx_excessive_deferral;
 818        u64 tx_single_collision;
 819        u64 tx_muliple_collision;
 820        u64 tx_late_collision;
 821        u64 tx_excessive_collision;
 822        u64 tx_total_collision;
 823        u64 tx_pause_honored;
 824        u64 tx_drop;
 825        u64 tx_jabber;
 826        u64 tx_fcs_error;
 827        u64 tx_control_frame;
 828        u64 tx_oversize;
 829        u64 tx_undersize;
 830        u64 tx_fragments;
 831} __packed;
 832
 833/* Complete statistics, DMAed from fw to host followed by
 834 * BFI_ENET_I2H_STATS_GET_RSP
 835 */
 836struct bfi_enet_stats {
 837        struct bfi_enet_stats_mac       mac_stats;
 838        struct bfi_enet_stats_bpc       bpc_stats;
 839        struct bfi_enet_stats_rad       rad_stats;
 840        struct bfi_enet_stats_rad       rlb_stats;
 841        struct bfi_enet_stats_fc_rx     fc_rx_stats;
 842        struct bfi_enet_stats_fc_tx     fc_tx_stats;
 843        struct bfi_enet_stats_rxf       rxf_stats[BFI_ENET_CFG_MAX];
 844        struct bfi_enet_stats_txf       txf_stats[BFI_ENET_CFG_MAX];
 845} __packed;
 846
 847#endif  /* __BFI_ENET_H__ */
 848