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