Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * Linux network driver for QLogic BR-series Converged Network Adapter.
0004  */
0005 /*
0006  * Copyright (c) 2005-2014 Brocade Communications Systems, Inc.
0007  * Copyright (c) 2014-2015 QLogic Corporation
0008  * All rights reserved
0009  * www.qlogic.com
0010  */
0011 
0012 /* BNA Hardware and Firmware Interface */
0013 
0014 /* Skipping statistics collection to avoid clutter.
0015  * Command is no longer needed:
0016  *  MTU
0017  *  TxQ Stop
0018  *  RxQ Stop
0019  *  RxF Enable/Disable
0020  *
0021  * HDS-off request is dynamic
0022  * keep structures as multiple of 32-bit fields for alignment.
0023  * All values must be written in big-endian.
0024  */
0025 #ifndef __BFI_ENET_H__
0026 #define __BFI_ENET_H__
0027 
0028 #include "bfa_defs.h"
0029 #include "bfi.h"
0030 
0031 #define BFI_ENET_CFG_MAX        32  /* Max resources per PF */
0032 
0033 #define BFI_ENET_TXQ_PRIO_MAX       8
0034 #define BFI_ENET_RX_QSET_MAX        16
0035 #define BFI_ENET_TXQ_WI_VECT_MAX    4
0036 
0037 #define BFI_ENET_VLAN_ID_MAX        4096
0038 #define BFI_ENET_VLAN_BLOCK_SIZE    512 /* in bits */
0039 #define BFI_ENET_VLAN_BLOCKS_MAX                    \
0040     (BFI_ENET_VLAN_ID_MAX / BFI_ENET_VLAN_BLOCK_SIZE)
0041 #define BFI_ENET_VLAN_WORD_SIZE     32  /* in bits */
0042 #define BFI_ENET_VLAN_WORDS_MAX                     \
0043     (BFI_ENET_VLAN_BLOCK_SIZE / BFI_ENET_VLAN_WORD_SIZE)
0044 
0045 #define BFI_ENET_RSS_RIT_MAX        64  /* entries */
0046 #define BFI_ENET_RSS_KEY_LEN        10  /* 32-bit words */
0047 
0048 union bfi_addr_be_u {
0049     struct {
0050         u32 addr_hi;    /* Most Significant 32-bits */
0051         u32 addr_lo;    /* Least Significant 32-Bits */
0052     } __packed a32;
0053 } __packed;
0054 
0055 /*  T X   Q U E U E   D E F I N E S      */
0056 /* TxQ Vector (a.k.a. Tx-Buffer Descriptor) */
0057 /* TxQ Entry Opcodes */
0058 #define BFI_ENET_TXQ_WI_SEND        (0x402) /* Single Frame Transmission */
0059 #define BFI_ENET_TXQ_WI_SEND_LSO    (0x403) /* Multi-Frame Transmission */
0060 #define BFI_ENET_TXQ_WI_EXTENSION   (0x104) /* Extension WI */
0061 
0062 /* TxQ Entry Control Flags */
0063 #define BFI_ENET_TXQ_WI_CF_FCOE_CRC BIT(8)
0064 #define BFI_ENET_TXQ_WI_CF_IPID_MODE    BIT(5)
0065 #define BFI_ENET_TXQ_WI_CF_INS_PRIO BIT(4)
0066 #define BFI_ENET_TXQ_WI_CF_INS_VLAN BIT(3)
0067 #define BFI_ENET_TXQ_WI_CF_UDP_CKSUM    BIT(2)
0068 #define BFI_ENET_TXQ_WI_CF_TCP_CKSUM    BIT(1)
0069 #define BFI_ENET_TXQ_WI_CF_IP_CKSUM BIT(0)
0070 
0071 struct bfi_enet_txq_wi_base {
0072     u8          reserved;
0073     u8          num_vectors;    /* number of vectors present */
0074     u16         opcode;
0075             /* BFI_ENET_TXQ_WI_SEND or BFI_ENET_TXQ_WI_SEND_LSO */
0076     u16         flags;      /* OR of all the flags */
0077     u16         l4_hdr_size_n_offset;
0078     u16         vlan_tag;
0079     u16         lso_mss;    /* Only 14 LSB are valid */
0080     u32         frame_length;   /* Only 24 LSB are valid */
0081 } __packed;
0082 
0083 struct bfi_enet_txq_wi_ext {
0084     u16         reserved;
0085     u16         opcode;     /* BFI_ENET_TXQ_WI_EXTENSION */
0086     u32         reserved2[3];
0087 } __packed;
0088 
0089 struct bfi_enet_txq_wi_vector {         /* Tx Buffer Descriptor */
0090     u16         reserved;
0091     u16         length;     /* Only 14 LSB are valid */
0092     union bfi_addr_be_u addr;
0093 } __packed;
0094 
0095 /*  TxQ Entry Structure  */
0096 struct bfi_enet_txq_entry {
0097     union {
0098         struct bfi_enet_txq_wi_base base;
0099         struct bfi_enet_txq_wi_ext  ext;
0100     } __packed wi;
0101     struct bfi_enet_txq_wi_vector vector[BFI_ENET_TXQ_WI_VECT_MAX];
0102 } __packed;
0103 
0104 #define wi_hdr      wi.base
0105 #define wi_ext_hdr  wi.ext
0106 
0107 #define BFI_ENET_TXQ_WI_L4_HDR_N_OFFSET(_hdr_size, _offset) \
0108         (((_hdr_size) << 10) | ((_offset) & 0x3FF))
0109 
0110 /*   R X   Q U E U E   D E F I N E S   */
0111 struct bfi_enet_rxq_entry {
0112     union bfi_addr_be_u  rx_buffer;
0113 } __packed;
0114 
0115 /*   R X   C O M P L E T I O N   Q U E U E   D E F I N E S   */
0116 /* CQ Entry Flags */
0117 #define BFI_ENET_CQ_EF_MAC_ERROR    BIT(0)
0118 #define BFI_ENET_CQ_EF_FCS_ERROR    BIT(1)
0119 #define BFI_ENET_CQ_EF_TOO_LONG     BIT(2)
0120 #define BFI_ENET_CQ_EF_FC_CRC_OK    BIT(3)
0121 
0122 #define BFI_ENET_CQ_EF_RSVD1        BIT(4)
0123 #define BFI_ENET_CQ_EF_L4_CKSUM_OK  BIT(5)
0124 #define BFI_ENET_CQ_EF_L3_CKSUM_OK  BIT(6)
0125 #define BFI_ENET_CQ_EF_HDS_HEADER   BIT(7)
0126 
0127 #define BFI_ENET_CQ_EF_UDP      BIT(8)
0128 #define BFI_ENET_CQ_EF_TCP      BIT(9)
0129 #define BFI_ENET_CQ_EF_IP_OPTIONS   BIT(10)
0130 #define BFI_ENET_CQ_EF_IPV6     BIT(11)
0131 
0132 #define BFI_ENET_CQ_EF_IPV4     BIT(12)
0133 #define BFI_ENET_CQ_EF_VLAN     BIT(13)
0134 #define BFI_ENET_CQ_EF_RSS      BIT(14)
0135 #define BFI_ENET_CQ_EF_RSVD2        BIT(15)
0136 
0137 #define BFI_ENET_CQ_EF_MCAST_MATCH  BIT(16)
0138 #define BFI_ENET_CQ_EF_MCAST        BIT(17)
0139 #define BFI_ENET_CQ_EF_BCAST        BIT(18)
0140 #define BFI_ENET_CQ_EF_REMOTE       BIT(19)
0141 
0142 #define BFI_ENET_CQ_EF_LOCAL        BIT(20)
0143 
0144 /* CQ Entry Structure */
0145 struct bfi_enet_cq_entry {
0146     u32 flags;
0147     u16 vlan_tag;
0148     u16 length;
0149     u32 rss_hash;
0150     u8  valid;
0151     u8  reserved1;
0152     u8  reserved2;
0153     u8  rxq_id;
0154 } __packed;
0155 
0156 /*   E N E T   C O N T R O L   P A T H   C O M M A N D S   */
0157 struct bfi_enet_q {
0158     union bfi_addr_u    pg_tbl;
0159     union bfi_addr_u    first_entry;
0160     u16     pages;  /* # of pages */
0161     u16     page_sz;
0162 } __packed;
0163 
0164 struct bfi_enet_txq {
0165     struct bfi_enet_q   q;
0166     u8          priority;
0167     u8          rsvd[3];
0168 } __packed;
0169 
0170 struct bfi_enet_rxq {
0171     struct bfi_enet_q   q;
0172     u16     rx_buffer_size;
0173     u16     rsvd;
0174 } __packed;
0175 
0176 struct bfi_enet_cq {
0177     struct bfi_enet_q   q;
0178 } __packed;
0179 
0180 struct bfi_enet_ib_cfg {
0181     u8      int_pkt_dma;
0182     u8      int_enabled;
0183     u8      int_pkt_enabled;
0184     u8      continuous_coalescing;
0185     u8      msix;
0186     u8      rsvd[3];
0187     u32 coalescing_timeout;
0188     u32 inter_pkt_timeout;
0189     u8      inter_pkt_count;
0190     u8      rsvd1[3];
0191 } __packed;
0192 
0193 struct bfi_enet_ib {
0194     union bfi_addr_u    index_addr;
0195     union {
0196         u16 msix_index;
0197         u16 intx_bitmask;
0198     } __packed intr;
0199     u16     rsvd;
0200 } __packed;
0201 
0202 /* ENET command messages */
0203 enum bfi_enet_h2i_msgs {
0204     /* Rx Commands */
0205     BFI_ENET_H2I_RX_CFG_SET_REQ = 1,
0206     BFI_ENET_H2I_RX_CFG_CLR_REQ = 2,
0207 
0208     BFI_ENET_H2I_RIT_CFG_REQ = 3,
0209     BFI_ENET_H2I_RSS_CFG_REQ = 4,
0210     BFI_ENET_H2I_RSS_ENABLE_REQ = 5,
0211     BFI_ENET_H2I_RX_PROMISCUOUS_REQ = 6,
0212     BFI_ENET_H2I_RX_DEFAULT_REQ = 7,
0213 
0214     BFI_ENET_H2I_MAC_UCAST_SET_REQ = 8,
0215     BFI_ENET_H2I_MAC_UCAST_CLR_REQ = 9,
0216     BFI_ENET_H2I_MAC_UCAST_ADD_REQ = 10,
0217     BFI_ENET_H2I_MAC_UCAST_DEL_REQ = 11,
0218 
0219     BFI_ENET_H2I_MAC_MCAST_ADD_REQ = 12,
0220     BFI_ENET_H2I_MAC_MCAST_DEL_REQ = 13,
0221     BFI_ENET_H2I_MAC_MCAST_FILTER_REQ = 14,
0222 
0223     BFI_ENET_H2I_RX_VLAN_SET_REQ = 15,
0224     BFI_ENET_H2I_RX_VLAN_STRIP_ENABLE_REQ = 16,
0225 
0226     /* Tx Commands */
0227     BFI_ENET_H2I_TX_CFG_SET_REQ = 17,
0228     BFI_ENET_H2I_TX_CFG_CLR_REQ = 18,
0229 
0230     /* Port Commands */
0231     BFI_ENET_H2I_PORT_ADMIN_UP_REQ = 19,
0232     BFI_ENET_H2I_SET_PAUSE_REQ = 20,
0233     BFI_ENET_H2I_DIAG_LOOPBACK_REQ = 21,
0234 
0235     /* Get Attributes Command */
0236     BFI_ENET_H2I_GET_ATTR_REQ = 22,
0237 
0238     /*  Statistics Commands */
0239     BFI_ENET_H2I_STATS_GET_REQ = 23,
0240     BFI_ENET_H2I_STATS_CLR_REQ = 24,
0241 
0242     BFI_ENET_H2I_WOL_MAGIC_REQ = 25,
0243     BFI_ENET_H2I_WOL_FRAME_REQ = 26,
0244 
0245     BFI_ENET_H2I_MAX = 27,
0246 };
0247 
0248 enum bfi_enet_i2h_msgs {
0249     /* Rx Responses */
0250     BFI_ENET_I2H_RX_CFG_SET_RSP =
0251         BFA_I2HM(BFI_ENET_H2I_RX_CFG_SET_REQ),
0252     BFI_ENET_I2H_RX_CFG_CLR_RSP =
0253         BFA_I2HM(BFI_ENET_H2I_RX_CFG_CLR_REQ),
0254 
0255     BFI_ENET_I2H_RIT_CFG_RSP =
0256         BFA_I2HM(BFI_ENET_H2I_RIT_CFG_REQ),
0257     BFI_ENET_I2H_RSS_CFG_RSP =
0258         BFA_I2HM(BFI_ENET_H2I_RSS_CFG_REQ),
0259     BFI_ENET_I2H_RSS_ENABLE_RSP =
0260         BFA_I2HM(BFI_ENET_H2I_RSS_ENABLE_REQ),
0261     BFI_ENET_I2H_RX_PROMISCUOUS_RSP =
0262         BFA_I2HM(BFI_ENET_H2I_RX_PROMISCUOUS_REQ),
0263     BFI_ENET_I2H_RX_DEFAULT_RSP =
0264         BFA_I2HM(BFI_ENET_H2I_RX_DEFAULT_REQ),
0265 
0266     BFI_ENET_I2H_MAC_UCAST_SET_RSP =
0267         BFA_I2HM(BFI_ENET_H2I_MAC_UCAST_SET_REQ),
0268     BFI_ENET_I2H_MAC_UCAST_CLR_RSP =
0269         BFA_I2HM(BFI_ENET_H2I_MAC_UCAST_CLR_REQ),
0270     BFI_ENET_I2H_MAC_UCAST_ADD_RSP =
0271         BFA_I2HM(BFI_ENET_H2I_MAC_UCAST_ADD_REQ),
0272     BFI_ENET_I2H_MAC_UCAST_DEL_RSP =
0273         BFA_I2HM(BFI_ENET_H2I_MAC_UCAST_DEL_REQ),
0274 
0275     BFI_ENET_I2H_MAC_MCAST_ADD_RSP =
0276         BFA_I2HM(BFI_ENET_H2I_MAC_MCAST_ADD_REQ),
0277     BFI_ENET_I2H_MAC_MCAST_DEL_RSP =
0278         BFA_I2HM(BFI_ENET_H2I_MAC_MCAST_DEL_REQ),
0279     BFI_ENET_I2H_MAC_MCAST_FILTER_RSP =
0280         BFA_I2HM(BFI_ENET_H2I_MAC_MCAST_FILTER_REQ),
0281 
0282     BFI_ENET_I2H_RX_VLAN_SET_RSP =
0283         BFA_I2HM(BFI_ENET_H2I_RX_VLAN_SET_REQ),
0284 
0285     BFI_ENET_I2H_RX_VLAN_STRIP_ENABLE_RSP =
0286         BFA_I2HM(BFI_ENET_H2I_RX_VLAN_STRIP_ENABLE_REQ),
0287 
0288     /* Tx Responses */
0289     BFI_ENET_I2H_TX_CFG_SET_RSP =
0290         BFA_I2HM(BFI_ENET_H2I_TX_CFG_SET_REQ),
0291     BFI_ENET_I2H_TX_CFG_CLR_RSP =
0292         BFA_I2HM(BFI_ENET_H2I_TX_CFG_CLR_REQ),
0293 
0294     /* Port Responses */
0295     BFI_ENET_I2H_PORT_ADMIN_RSP =
0296         BFA_I2HM(BFI_ENET_H2I_PORT_ADMIN_UP_REQ),
0297 
0298     BFI_ENET_I2H_SET_PAUSE_RSP =
0299         BFA_I2HM(BFI_ENET_H2I_SET_PAUSE_REQ),
0300     BFI_ENET_I2H_DIAG_LOOPBACK_RSP =
0301         BFA_I2HM(BFI_ENET_H2I_DIAG_LOOPBACK_REQ),
0302 
0303     /*  Attributes Response */
0304     BFI_ENET_I2H_GET_ATTR_RSP =
0305         BFA_I2HM(BFI_ENET_H2I_GET_ATTR_REQ),
0306 
0307     /* Statistics Responses */
0308     BFI_ENET_I2H_STATS_GET_RSP =
0309         BFA_I2HM(BFI_ENET_H2I_STATS_GET_REQ),
0310     BFI_ENET_I2H_STATS_CLR_RSP =
0311         BFA_I2HM(BFI_ENET_H2I_STATS_CLR_REQ),
0312 
0313     BFI_ENET_I2H_WOL_MAGIC_RSP =
0314         BFA_I2HM(BFI_ENET_H2I_WOL_MAGIC_REQ),
0315     BFI_ENET_I2H_WOL_FRAME_RSP =
0316         BFA_I2HM(BFI_ENET_H2I_WOL_FRAME_REQ),
0317 
0318     /* AENs */
0319     BFI_ENET_I2H_LINK_DOWN_AEN = BFA_I2HM(BFI_ENET_H2I_MAX),
0320     BFI_ENET_I2H_LINK_UP_AEN = BFA_I2HM(BFI_ENET_H2I_MAX + 1),
0321 
0322     BFI_ENET_I2H_PORT_ENABLE_AEN = BFA_I2HM(BFI_ENET_H2I_MAX + 2),
0323     BFI_ENET_I2H_PORT_DISABLE_AEN = BFA_I2HM(BFI_ENET_H2I_MAX + 3),
0324 
0325     BFI_ENET_I2H_BW_UPDATE_AEN = BFA_I2HM(BFI_ENET_H2I_MAX + 4),
0326 };
0327 
0328 /* The following error codes can be returned by the enet commands */
0329 enum bfi_enet_err {
0330     BFI_ENET_CMD_OK     = 0,
0331     BFI_ENET_CMD_FAIL   = 1,
0332     BFI_ENET_CMD_DUP_ENTRY  = 2,    /* !< Duplicate entry in CAM */
0333     BFI_ENET_CMD_CAM_FULL   = 3,    /* !< CAM is full */
0334     BFI_ENET_CMD_NOT_OWNER  = 4,    /* !< Not permitted, b'cos not owner */
0335     BFI_ENET_CMD_NOT_EXEC   = 5,    /* !< Was not sent to f/w at all */
0336     BFI_ENET_CMD_WAITING    = 6,    /* !< Waiting for completion */
0337     BFI_ENET_CMD_PORT_DISABLED = 7, /* !< port in disabled state */
0338 };
0339 
0340 /* Generic Request
0341  *
0342  * bfi_enet_req is used by:
0343  *  BFI_ENET_H2I_RX_CFG_CLR_REQ
0344  *  BFI_ENET_H2I_TX_CFG_CLR_REQ
0345  */
0346 struct bfi_enet_req {
0347     struct bfi_msgq_mhdr mh;
0348 } __packed;
0349 
0350 /* Enable/Disable Request
0351  *
0352  * bfi_enet_enable_req is used by:
0353  *  BFI_ENET_H2I_RSS_ENABLE_REQ (enet_id must be zero)
0354  *  BFI_ENET_H2I_RX_PROMISCUOUS_REQ (enet_id must be zero)
0355  *  BFI_ENET_H2I_RX_DEFAULT_REQ (enet_id must be zero)
0356  *  BFI_ENET_H2I_RX_MAC_MCAST_FILTER_REQ
0357  *  BFI_ENET_H2I_PORT_ADMIN_UP_REQ  (enet_id must be zero)
0358  */
0359 struct bfi_enet_enable_req {
0360     struct      bfi_msgq_mhdr mh;
0361     u8      enable;     /* 1 = enable;  0 = disable */
0362     u8      rsvd[3];
0363 } __packed;
0364 
0365 /* Generic Response */
0366 struct bfi_enet_rsp {
0367     struct bfi_msgq_mhdr mh;
0368     u8      error;      /*!< if error see cmd_offset */
0369     u8      rsvd;
0370     u16     cmd_offset; /*!< offset to invalid parameter */
0371 } __packed;
0372 
0373 /* GLOBAL CONFIGURATION */
0374 
0375 /* bfi_enet_attr_req is used by:
0376  *  BFI_ENET_H2I_GET_ATTR_REQ
0377  */
0378 struct bfi_enet_attr_req {
0379     struct bfi_msgq_mhdr    mh;
0380 } __packed;
0381 
0382 /* bfi_enet_attr_rsp is used by:
0383  *  BFI_ENET_I2H_GET_ATTR_RSP
0384  */
0385 struct bfi_enet_attr_rsp {
0386     struct bfi_msgq_mhdr mh;
0387     u8      error;      /*!< if error see cmd_offset */
0388     u8      rsvd;
0389     u16     cmd_offset; /*!< offset to invalid parameter */
0390     u32     max_cfg;
0391     u32     max_ucmac;
0392     u32     rit_size;
0393 } __packed;
0394 
0395 /* Tx Configuration
0396  *
0397  * bfi_enet_tx_cfg is used by:
0398  *  BFI_ENET_H2I_TX_CFG_SET_REQ
0399  */
0400 enum bfi_enet_tx_vlan_mode {
0401     BFI_ENET_TX_VLAN_NOP    = 0,
0402     BFI_ENET_TX_VLAN_INS    = 1,
0403     BFI_ENET_TX_VLAN_WI = 2,
0404 };
0405 
0406 struct bfi_enet_tx_cfg {
0407     u8      vlan_mode;  /*!< processing mode */
0408     u8      rsvd;
0409     u16     vlan_id;
0410     u8      admit_tagged_frame;
0411     u8      apply_vlan_filter;
0412     u8      add_to_vswitch;
0413     u8      rsvd1[1];
0414 } __packed;
0415 
0416 struct bfi_enet_tx_cfg_req {
0417     struct bfi_msgq_mhdr mh;
0418     u8          num_queues; /* # of Tx Queues */
0419     u8          rsvd[3];
0420 
0421     struct {
0422         struct bfi_enet_txq q;
0423         struct bfi_enet_ib  ib;
0424     } __packed q_cfg[BFI_ENET_TXQ_PRIO_MAX];
0425 
0426     struct bfi_enet_ib_cfg  ib_cfg;
0427 
0428     struct bfi_enet_tx_cfg  tx_cfg;
0429 };
0430 
0431 struct bfi_enet_tx_cfg_rsp {
0432     struct      bfi_msgq_mhdr mh;
0433     u8      error;
0434     u8      hw_id;      /* For debugging */
0435     u8      rsvd[2];
0436     struct {
0437         u32 q_dbell;    /* PCI base address offset */
0438         u32 i_dbell;    /* PCI base address offset */
0439         u8  hw_qid;     /* For debugging */
0440         u8  rsvd[3];
0441     } __packed q_handles[BFI_ENET_TXQ_PRIO_MAX];
0442 };
0443 
0444 /* Rx Configuration
0445  *
0446  * bfi_enet_rx_cfg is used by:
0447  *  BFI_ENET_H2I_RX_CFG_SET_REQ
0448  */
0449 enum bfi_enet_rxq_type {
0450     BFI_ENET_RXQ_SINGLE     = 1,
0451     BFI_ENET_RXQ_LARGE_SMALL    = 2,
0452     BFI_ENET_RXQ_HDS        = 3,
0453     BFI_ENET_RXQ_HDS_OPT_BASED  = 4,
0454 };
0455 
0456 enum bfi_enet_hds_type {
0457     BFI_ENET_HDS_FORCED = 0x01,
0458     BFI_ENET_HDS_IPV6_UDP   = 0x02,
0459     BFI_ENET_HDS_IPV6_TCP   = 0x04,
0460     BFI_ENET_HDS_IPV4_TCP   = 0x08,
0461     BFI_ENET_HDS_IPV4_UDP   = 0x10,
0462 };
0463 
0464 struct bfi_enet_rx_cfg {
0465     u8      rxq_type;
0466     u8      rsvd[1];
0467     u16     frame_size;
0468 
0469     struct {
0470         u8          max_header_size;
0471         u8          force_offset;
0472         u8          type;
0473         u8          rsvd1;
0474     } __packed hds;
0475 
0476     u8      multi_buffer;
0477     u8      strip_vlan;
0478     u8      drop_untagged;
0479     u8      rsvd2;
0480 } __packed;
0481 
0482 /*
0483  * Multicast frames are received on the ql of q-set index zero.
0484  * On the completion queue.  RxQ ID = even is for large/data buffer queues
0485  * and RxQ ID = odd is for small/header buffer queues.
0486  */
0487 struct bfi_enet_rx_cfg_req {
0488     struct bfi_msgq_mhdr mh;
0489     u8          num_queue_sets; /* # of Rx Queue Sets */
0490     u8          rsvd[3];
0491 
0492     struct {
0493         struct bfi_enet_rxq ql; /* large/data/single buffers */
0494         struct bfi_enet_rxq qs; /* small/header buffers */
0495         struct bfi_enet_cq  cq;
0496         struct bfi_enet_ib  ib;
0497     } __packed q_cfg[BFI_ENET_RX_QSET_MAX];
0498 
0499     struct bfi_enet_ib_cfg  ib_cfg;
0500 
0501     struct bfi_enet_rx_cfg  rx_cfg;
0502 } __packed;
0503 
0504 struct bfi_enet_rx_cfg_rsp {
0505     struct bfi_msgq_mhdr mh;
0506     u8      error;
0507     u8      hw_id;   /* For debugging */
0508     u8      rsvd[2];
0509     struct {
0510         u32 ql_dbell; /* PCI base address offset */
0511         u32 qs_dbell; /* PCI base address offset */
0512         u32 i_dbell;  /* PCI base address offset */
0513         u8      hw_lqid;  /* For debugging */
0514         u8      hw_sqid;  /* For debugging */
0515         u8      hw_cqid;  /* For debugging */
0516         u8      rsvd;
0517     } __packed q_handles[BFI_ENET_RX_QSET_MAX];
0518 } __packed;
0519 
0520 /* RIT
0521  *
0522  * bfi_enet_rit_req is used by:
0523  *  BFI_ENET_H2I_RIT_CFG_REQ
0524  */
0525 struct bfi_enet_rit_req {
0526     struct  bfi_msgq_mhdr mh;
0527     u16 size;           /* number of table-entries used */
0528     u8  rsvd[2];
0529     u8  table[BFI_ENET_RSS_RIT_MAX];
0530 } __packed;
0531 
0532 /* RSS
0533  *
0534  * bfi_enet_rss_cfg_req is used by:
0535  *  BFI_ENET_H2I_RSS_CFG_REQ
0536  */
0537 enum bfi_enet_rss_type {
0538     BFI_ENET_RSS_IPV6   = 0x01,
0539     BFI_ENET_RSS_IPV6_TCP   = 0x02,
0540     BFI_ENET_RSS_IPV4   = 0x04,
0541     BFI_ENET_RSS_IPV4_TCP   = 0x08
0542 };
0543 
0544 struct bfi_enet_rss_cfg {
0545     u8  type;
0546     u8  mask;
0547     u8  rsvd[2];
0548     u32 key[BFI_ENET_RSS_KEY_LEN];
0549 } __packed;
0550 
0551 struct bfi_enet_rss_cfg_req {
0552     struct bfi_msgq_mhdr    mh;
0553     struct bfi_enet_rss_cfg cfg;
0554 } __packed;
0555 
0556 /* MAC Unicast
0557  *
0558  * bfi_enet_rx_vlan_req is used by:
0559  *  BFI_ENET_H2I_MAC_UCAST_SET_REQ
0560  *  BFI_ENET_H2I_MAC_UCAST_CLR_REQ
0561  *  BFI_ENET_H2I_MAC_UCAST_ADD_REQ
0562  *  BFI_ENET_H2I_MAC_UCAST_DEL_REQ
0563  */
0564 struct bfi_enet_ucast_req {
0565     struct bfi_msgq_mhdr    mh;
0566     u8          mac_addr[ETH_ALEN];
0567     u8          rsvd[2];
0568 } __packed;
0569 
0570 /* MAC Unicast + VLAN */
0571 struct bfi_enet_mac_n_vlan_req {
0572     struct bfi_msgq_mhdr    mh;
0573     u16         vlan_id;
0574     u8          mac_addr[ETH_ALEN];
0575 } __packed;
0576 
0577 /* MAC Multicast
0578  *
0579  * bfi_enet_mac_mfilter_add_req is used by:
0580  *  BFI_ENET_H2I_MAC_MCAST_ADD_REQ
0581  */
0582 struct bfi_enet_mcast_add_req {
0583     struct bfi_msgq_mhdr    mh;
0584     u8          mac_addr[ETH_ALEN];
0585     u8          rsvd[2];
0586 } __packed;
0587 
0588 /* bfi_enet_mac_mfilter_add_rsp is used by:
0589  *  BFI_ENET_I2H_MAC_MCAST_ADD_RSP
0590  */
0591 struct bfi_enet_mcast_add_rsp {
0592     struct bfi_msgq_mhdr    mh;
0593     u8          error;
0594     u8          rsvd;
0595     u16         cmd_offset;
0596     u16         handle;
0597     u8          rsvd1[2];
0598 } __packed;
0599 
0600 /* bfi_enet_mac_mfilter_del_req is used by:
0601  *  BFI_ENET_H2I_MAC_MCAST_DEL_REQ
0602  */
0603 struct bfi_enet_mcast_del_req {
0604     struct bfi_msgq_mhdr    mh;
0605     u16         handle;
0606     u8          rsvd[2];
0607 } __packed;
0608 
0609 /* VLAN
0610  *
0611  * bfi_enet_rx_vlan_req is used by:
0612  *  BFI_ENET_H2I_RX_VLAN_SET_REQ
0613  */
0614 struct bfi_enet_rx_vlan_req {
0615     struct bfi_msgq_mhdr    mh;
0616     u8          block_idx;
0617     u8          rsvd[3];
0618     u32         bit_mask[BFI_ENET_VLAN_WORDS_MAX];
0619 } __packed;
0620 
0621 /* PAUSE
0622  *
0623  * bfi_enet_set_pause_req is used by:
0624  *  BFI_ENET_H2I_SET_PAUSE_REQ
0625  */
0626 struct bfi_enet_set_pause_req {
0627     struct bfi_msgq_mhdr    mh;
0628     u8          rsvd[2];
0629     u8          tx_pause;   /* 1 = enable;  0 = disable */
0630     u8          rx_pause;   /* 1 = enable;  0 = disable */
0631 } __packed;
0632 
0633 /* DIAGNOSTICS
0634  *
0635  * bfi_enet_diag_lb_req is used by:
0636  *      BFI_ENET_H2I_DIAG_LOOPBACK
0637  */
0638 struct bfi_enet_diag_lb_req {
0639     struct bfi_msgq_mhdr    mh;
0640     u8          rsvd[2];
0641     u8          mode;       /* cable or Serdes */
0642     u8          enable;     /* 1 = enable;  0 = disable */
0643 } __packed;
0644 
0645 /* enum for Loopback opmodes */
0646 enum {
0647     BFI_ENET_DIAG_LB_OPMODE_EXT = 0,
0648     BFI_ENET_DIAG_LB_OPMODE_CBL = 1,
0649 };
0650 
0651 /* STATISTICS
0652  *
0653  * bfi_enet_stats_req is used by:
0654  *    BFI_ENET_H2I_STATS_GET_REQ
0655  *    BFI_ENET_I2H_STATS_CLR_REQ
0656  */
0657 struct bfi_enet_stats_req {
0658     struct bfi_msgq_mhdr    mh;
0659     u16         stats_mask;
0660     u8          rsvd[2];
0661     u32         rx_enet_mask;
0662     u32         tx_enet_mask;
0663     union bfi_addr_u    host_buffer;
0664 } __packed;
0665 
0666 /* defines for "stats_mask" above. */
0667 #define BFI_ENET_STATS_MAC    BIT(0)    /* !< MAC Statistics */
0668 #define BFI_ENET_STATS_BPC    BIT(1)    /* !< Pause Stats from BPC */
0669 #define BFI_ENET_STATS_RAD    BIT(2)    /* !< Rx Admission Statistics */
0670 #define BFI_ENET_STATS_RX_FC  BIT(3)    /* !< Rx FC Stats from RxA */
0671 #define BFI_ENET_STATS_TX_FC  BIT(4)    /* !< Tx FC Stats from TxA */
0672 
0673 #define BFI_ENET_STATS_ALL    0x1f
0674 
0675 /* TxF Frame Statistics */
0676 struct bfi_enet_stats_txf {
0677     u64 ucast_octets;
0678     u64 ucast;
0679     u64 ucast_vlan;
0680 
0681     u64 mcast_octets;
0682     u64 mcast;
0683     u64 mcast_vlan;
0684 
0685     u64 bcast_octets;
0686     u64 bcast;
0687     u64 bcast_vlan;
0688 
0689     u64 errors;
0690     u64 filter_vlan;      /* frames filtered due to VLAN */
0691     u64 filter_mac_sa;    /* frames filtered due to SA check */
0692 } __packed;
0693 
0694 /* RxF Frame Statistics */
0695 struct bfi_enet_stats_rxf {
0696     u64 ucast_octets;
0697     u64 ucast;
0698     u64 ucast_vlan;
0699 
0700     u64 mcast_octets;
0701     u64 mcast;
0702     u64 mcast_vlan;
0703 
0704     u64 bcast_octets;
0705     u64 bcast;
0706     u64 bcast_vlan;
0707     u64 frame_drops;
0708 } __packed;
0709 
0710 /* FC Tx Frame Statistics */
0711 struct bfi_enet_stats_fc_tx {
0712     u64 txf_ucast_octets;
0713     u64 txf_ucast;
0714     u64 txf_ucast_vlan;
0715 
0716     u64 txf_mcast_octets;
0717     u64 txf_mcast;
0718     u64 txf_mcast_vlan;
0719 
0720     u64 txf_bcast_octets;
0721     u64 txf_bcast;
0722     u64 txf_bcast_vlan;
0723 
0724     u64 txf_parity_errors;
0725     u64 txf_timeout;
0726     u64 txf_fid_parity_errors;
0727 } __packed;
0728 
0729 /* FC Rx Frame Statistics */
0730 struct bfi_enet_stats_fc_rx {
0731     u64 rxf_ucast_octets;
0732     u64 rxf_ucast;
0733     u64 rxf_ucast_vlan;
0734 
0735     u64 rxf_mcast_octets;
0736     u64 rxf_mcast;
0737     u64 rxf_mcast_vlan;
0738 
0739     u64 rxf_bcast_octets;
0740     u64 rxf_bcast;
0741     u64 rxf_bcast_vlan;
0742 } __packed;
0743 
0744 /* RAD Frame Statistics */
0745 struct bfi_enet_stats_rad {
0746     u64 rx_frames;
0747     u64 rx_octets;
0748     u64 rx_vlan_frames;
0749 
0750     u64 rx_ucast;
0751     u64 rx_ucast_octets;
0752     u64 rx_ucast_vlan;
0753 
0754     u64 rx_mcast;
0755     u64 rx_mcast_octets;
0756     u64 rx_mcast_vlan;
0757 
0758     u64 rx_bcast;
0759     u64 rx_bcast_octets;
0760     u64 rx_bcast_vlan;
0761 
0762     u64 rx_drops;
0763 } __packed;
0764 
0765 /* BPC Tx Registers */
0766 struct bfi_enet_stats_bpc {
0767     /* transmit stats */
0768     u64 tx_pause[8];
0769     u64 tx_zero_pause[8];   /*!< Pause cancellation */
0770     /*!<Pause initiation rather than retention */
0771     u64 tx_first_pause[8];
0772 
0773     /* receive stats */
0774     u64 rx_pause[8];
0775     u64 rx_zero_pause[8];   /*!< Pause cancellation */
0776     /*!<Pause initiation rather than retention */
0777     u64 rx_first_pause[8];
0778 } __packed;
0779 
0780 /* MAC Rx Statistics */
0781 struct bfi_enet_stats_mac {
0782     u64 stats_clr_cnt;  /* times this stats cleared */
0783     u64 frame_64;       /* both rx and tx counter */
0784     u64 frame_65_127;       /* both rx and tx counter */
0785     u64 frame_128_255;      /* both rx and tx counter */
0786     u64 frame_256_511;      /* both rx and tx counter */
0787     u64 frame_512_1023; /* both rx and tx counter */
0788     u64 frame_1024_1518;    /* both rx and tx counter */
0789     u64 frame_1519_1522;    /* both rx and tx counter */
0790 
0791     /* receive stats */
0792     u64 rx_bytes;
0793     u64 rx_packets;
0794     u64 rx_fcs_error;
0795     u64 rx_multicast;
0796     u64 rx_broadcast;
0797     u64 rx_control_frames;
0798     u64 rx_pause;
0799     u64 rx_unknown_opcode;
0800     u64 rx_alignment_error;
0801     u64 rx_frame_length_error;
0802     u64 rx_code_error;
0803     u64 rx_carrier_sense_error;
0804     u64 rx_undersize;
0805     u64 rx_oversize;
0806     u64 rx_fragments;
0807     u64 rx_jabber;
0808     u64 rx_drop;
0809 
0810     /* transmit stats */
0811     u64 tx_bytes;
0812     u64 tx_packets;
0813     u64 tx_multicast;
0814     u64 tx_broadcast;
0815     u64 tx_pause;
0816     u64 tx_deferral;
0817     u64 tx_excessive_deferral;
0818     u64 tx_single_collision;
0819     u64 tx_muliple_collision;
0820     u64 tx_late_collision;
0821     u64 tx_excessive_collision;
0822     u64 tx_total_collision;
0823     u64 tx_pause_honored;
0824     u64 tx_drop;
0825     u64 tx_jabber;
0826     u64 tx_fcs_error;
0827     u64 tx_control_frame;
0828     u64 tx_oversize;
0829     u64 tx_undersize;
0830     u64 tx_fragments;
0831 } __packed;
0832 
0833 /* Complete statistics, DMAed from fw to host followed by
0834  * BFI_ENET_I2H_STATS_GET_RSP
0835  */
0836 struct bfi_enet_stats {
0837     struct bfi_enet_stats_mac   mac_stats;
0838     struct bfi_enet_stats_bpc   bpc_stats;
0839     struct bfi_enet_stats_rad   rad_stats;
0840     struct bfi_enet_stats_rad   rlb_stats;
0841     struct bfi_enet_stats_fc_rx fc_rx_stats;
0842     struct bfi_enet_stats_fc_tx fc_tx_stats;
0843     struct bfi_enet_stats_rxf   rxf_stats[BFI_ENET_CFG_MAX];
0844     struct bfi_enet_stats_txf   txf_stats[BFI_ENET_CFG_MAX];
0845 } __packed;
0846 
0847 #endif  /* __BFI_ENET_H__ */