1*eef4f27bSRobert Mustacchi /* 2*eef4f27bSRobert Mustacchi * Copyright 2014-2017 Cavium, Inc. 3*eef4f27bSRobert Mustacchi * The contents of this file are subject to the terms of the Common Development 4*eef4f27bSRobert Mustacchi * and Distribution License, v.1, (the "License"). 5*eef4f27bSRobert Mustacchi * 6*eef4f27bSRobert Mustacchi * You may not use this file except in compliance with the License. 7*eef4f27bSRobert Mustacchi * 8*eef4f27bSRobert Mustacchi * You can obtain a copy of the License at available 9*eef4f27bSRobert Mustacchi * at http://opensource.org/licenses/CDDL-1.0 10*eef4f27bSRobert Mustacchi * 11*eef4f27bSRobert Mustacchi * See the License for the specific language governing permissions and 12*eef4f27bSRobert Mustacchi * limitations under the License. 13*eef4f27bSRobert Mustacchi */ 14*eef4f27bSRobert Mustacchi 15*eef4f27bSRobert Mustacchi #ifndef _LM_DEFS_H 16*eef4f27bSRobert Mustacchi #define _LM_DEFS_H 17*eef4f27bSRobert Mustacchi 18*eef4f27bSRobert Mustacchi #ifdef __cplusplus 19*eef4f27bSRobert Mustacchi extern "C" { 20*eef4f27bSRobert Mustacchi #endif 21*eef4f27bSRobert Mustacchi 22*eef4f27bSRobert Mustacchi #include "bcmtype.h" 23*eef4f27bSRobert Mustacchi 24*eef4f27bSRobert Mustacchi /* 25*eef4f27bSRobert Mustacchi * Simple constants. 26*eef4f27bSRobert Mustacchi */ 27*eef4f27bSRobert Mustacchi 28*eef4f27bSRobert Mustacchi #ifndef TRUE 29*eef4f27bSRobert Mustacchi #define TRUE 1 30*eef4f27bSRobert Mustacchi #endif 31*eef4f27bSRobert Mustacchi 32*eef4f27bSRobert Mustacchi #ifndef FALSE 33*eef4f27bSRobert Mustacchi #define FALSE 0 34*eef4f27bSRobert Mustacchi #endif 35*eef4f27bSRobert Mustacchi 36*eef4f27bSRobert Mustacchi #ifndef NULL 37*eef4f27bSRobert Mustacchi #define NULL ((void *) 0) 38*eef4f27bSRobert Mustacchi #endif 39*eef4f27bSRobert Mustacchi 40*eef4f27bSRobert Mustacchi 41*eef4f27bSRobert Mustacchi /* Signatures for integrity checks. */ 42*eef4f27bSRobert Mustacchi #define LM_DEVICE_SIG 0x6d635242 /* BRcm */ 43*eef4f27bSRobert Mustacchi #define L2PACKET_RX_SIG 0x7872324c /* L2rx */ 44*eef4f27bSRobert Mustacchi #define L2PACKET_TX_SIG 0x7874324c /* L2tx */ 45*eef4f27bSRobert Mustacchi #define L4BUFFER_RX_SIG 0x7872344c /* L4rx */ 46*eef4f27bSRobert Mustacchi #define L4BUFFER_TX_SIG 0x7874344c /* L4tx */ 47*eef4f27bSRobert Mustacchi #define L4BUFFER_SIG 0x66754254 /* TBuf */ 48*eef4f27bSRobert Mustacchi #define L4GEN_BUFFER_SIG 0x006e6567 /* gen */ 49*eef4f27bSRobert Mustacchi #define L4GEN_BUFFER_SIG_END 0x0067656e /* neg */ 50*eef4f27bSRobert Mustacchi 51*eef4f27bSRobert Mustacchi #define SIZEOF_SIG 16 52*eef4f27bSRobert Mustacchi #define SIG(_p) (*((u32_t *)((u8_t *)(_p) - sizeof (u32_t)))) 53*eef4f27bSRobert Mustacchi #define END_SIG(_p, _size) (*((u32_t *)((u8_t *)(_p) + (_size)))) 54*eef4f27bSRobert Mustacchi 55*eef4f27bSRobert Mustacchi /* 56*eef4f27bSRobert Mustacchi * This macro rounds the given value to the next word boundary if it 57*eef4f27bSRobert Mustacchi * is not already at a word boundary. 58*eef4f27bSRobert Mustacchi */ 59*eef4f27bSRobert Mustacchi #define ALIGN_VALUE_TO_WORD_BOUNDARY(_v) \ 60*eef4f27bSRobert Mustacchi (((_v) + (sizeof (void *) - 1)) & ~(sizeof (void *) - 1)) 61*eef4f27bSRobert Mustacchi 62*eef4f27bSRobert Mustacchi /* 63*eef4f27bSRobert Mustacchi * This macro determines the delta to the next alignment which is 64*eef4f27bSRobert Mustacchi * either 1, 2, 4, 8, 16, 32, etc. 65*eef4f27bSRobert Mustacchi */ 66*eef4f27bSRobert Mustacchi #define ALIGN_DELTA_TO_BOUNDARY(_p, _a) \ 67*eef4f27bSRobert Mustacchi (((((u8_t *)(_p) - (u8_t *)0) + ((_a) - 1)) & ~((_a) - 1)) - \ 68*eef4f27bSRobert Mustacchi ((u8_t *)(_p) - (u8_t *)0)) 69*eef4f27bSRobert Mustacchi 70*eef4f27bSRobert Mustacchi /* 71*eef4f27bSRobert Mustacchi * This macro returns the pointer to the next alignment if the pointer 72*eef4f27bSRobert Mustacchi * is not currently on the indicated alignment boundary. 73*eef4f27bSRobert Mustacchi */ 74*eef4f27bSRobert Mustacchi #define ALIGN_PTR_TO_BOUNDARY(_p, _a) \ 75*eef4f27bSRobert Mustacchi ((u8_t *)(_p) + ALIGN_DELTA_TO_BOUNDARY(_p, _a)) 76*eef4f27bSRobert Mustacchi 77*eef4f27bSRobert Mustacchi 78*eef4f27bSRobert Mustacchi 79*eef4f27bSRobert Mustacchi /* 80*eef4f27bSRobert Mustacchi * Status codes. 81*eef4f27bSRobert Mustacchi */ 82*eef4f27bSRobert Mustacchi 83*eef4f27bSRobert Mustacchi typedef enum 84*eef4f27bSRobert Mustacchi { 85*eef4f27bSRobert Mustacchi LM_STATUS_SUCCESS = 0, 86*eef4f27bSRobert Mustacchi LM_STATUS_LINK_UNKNOWN = 0, 87*eef4f27bSRobert Mustacchi LM_STATUS_FAILURE = 1, 88*eef4f27bSRobert Mustacchi LM_STATUS_RESOURCE = 2, 89*eef4f27bSRobert Mustacchi LM_STATUS_ABORTED = 3, 90*eef4f27bSRobert Mustacchi LM_STATUS_PENDING = 4, 91*eef4f27bSRobert Mustacchi LM_STATUS_PAUSED = 5, 92*eef4f27bSRobert Mustacchi LM_STATUS_INVALID_PARAMETER = 6, 93*eef4f27bSRobert Mustacchi LM_STATUS_LINK_ACTIVE = 7, 94*eef4f27bSRobert Mustacchi LM_STATUS_LINK_DOWN = 8, 95*eef4f27bSRobert Mustacchi LM_STATUS_UNKNOWN_ADAPTER = 9, 96*eef4f27bSRobert Mustacchi LM_STATUS_UNKNOWN_PHY = 10, 97*eef4f27bSRobert Mustacchi LM_STATUS_UNKNOWN_MEDIUM = 11, 98*eef4f27bSRobert Mustacchi LM_STATUS_TOO_MANY_FRAGMENTS = 12, 99*eef4f27bSRobert Mustacchi LM_STATUS_BUFFER_TOO_SHORT = 16, 100*eef4f27bSRobert Mustacchi LM_STATUS_UPLOAD_IN_PROGRESS = 17, 101*eef4f27bSRobert Mustacchi LM_STATUS_BUSY = 18, 102*eef4f27bSRobert Mustacchi LM_STATUS_INVALID_KEY = 19, 103*eef4f27bSRobert Mustacchi LM_STATUS_TIMEOUT = 20, 104*eef4f27bSRobert Mustacchi LM_STATUS_REQUEST_NOT_ACCEPTED = 21, 105*eef4f27bSRobert Mustacchi LM_STATUS_CONNECTION_CLOSED = 22, 106*eef4f27bSRobert Mustacchi LM_STATUS_BAD_SIGNATURE = 23, 107*eef4f27bSRobert Mustacchi LM_STATUS_CONNECTION_RESET = 24, 108*eef4f27bSRobert Mustacchi LM_STATUS_EXISTING_OBJECT = 25, 109*eef4f27bSRobert Mustacchi LM_STATUS_OBJECT_NOT_FOUND = 26, 110*eef4f27bSRobert Mustacchi LM_STATUS_CONNECTION_RM_DISC = 27, 111*eef4f27bSRobert Mustacchi LM_STATUS_VF_LAMAC_REJECTED = 28, 112*eef4f27bSRobert Mustacchi LM_STATUS_NOT_IMPLEMENTED = 29, 113*eef4f27bSRobert Mustacchi LM_STATUS_UNKNOWN_EVENT_CODE = 30 114*eef4f27bSRobert Mustacchi } lm_status_t; 115*eef4f27bSRobert Mustacchi 116*eef4f27bSRobert Mustacchi 117*eef4f27bSRobert Mustacchi /* 118*eef4f27bSRobert Mustacchi * Receive filter masks. 119*eef4f27bSRobert Mustacchi */ 120*eef4f27bSRobert Mustacchi 121*eef4f27bSRobert Mustacchi typedef u32_t lm_rx_mask_t; 122*eef4f27bSRobert Mustacchi 123*eef4f27bSRobert Mustacchi #define LM_RX_MASK_ACCEPT_NONE 0x0000 124*eef4f27bSRobert Mustacchi #define LM_RX_MASK_ACCEPT_UNICAST 0x0001 125*eef4f27bSRobert Mustacchi #define LM_RX_MASK_ACCEPT_MULTICAST 0x0002 126*eef4f27bSRobert Mustacchi #define LM_RX_MASK_ACCEPT_ALL_MULTICAST 0x0004 127*eef4f27bSRobert Mustacchi #define LM_RX_MASK_ACCEPT_BROADCAST 0x0008 128*eef4f27bSRobert Mustacchi #define LM_RX_MASK_ACCEPT_ERROR_PACKET 0x0010 129*eef4f27bSRobert Mustacchi 130*eef4f27bSRobert Mustacchi #define LM_RX_MASK_PROMISCUOUS_MODE 0x10000 131*eef4f27bSRobert Mustacchi 132*eef4f27bSRobert Mustacchi 133*eef4f27bSRobert Mustacchi 134*eef4f27bSRobert Mustacchi /* 135*eef4f27bSRobert Mustacchi * Flow control. 136*eef4f27bSRobert Mustacchi */ 137*eef4f27bSRobert Mustacchi 138*eef4f27bSRobert Mustacchi typedef u32_t lm_flow_control_t; 139*eef4f27bSRobert Mustacchi 140*eef4f27bSRobert Mustacchi #define LM_FLOW_CONTROL_NONE 0x00 141*eef4f27bSRobert Mustacchi #define LM_FLOW_CONTROL_RECEIVE_PAUSE 0x01 142*eef4f27bSRobert Mustacchi #define LM_FLOW_CONTROL_TRANSMIT_PAUSE 0x02 143*eef4f27bSRobert Mustacchi 144*eef4f27bSRobert Mustacchi /* 145*eef4f27bSRobert Mustacchi * This value can be or-ed with RECEIVE_PAUSE and TRANSMIT_PAUSE. If the 146*eef4f27bSRobert Mustacchi * auto-negotiation is disabled and the RECEIVE_PAUSE and TRANSMIT_PAUSE bits 147*eef4f27bSRobert Mustacchi * are set, then flow control is enabled regardless of link partner's flow 148*eef4f27bSRobert Mustacchi * control capability. Otherwise, if this bit is set, then flow is negotiated 149*eef4f27bSRobert Mustacchi * with the link partner. Values 0x80000000 and 0x80000003 are equivalent. 150*eef4f27bSRobert Mustacchi */ 151*eef4f27bSRobert Mustacchi #define LM_FLOW_CONTROL_AUTO_PAUSE 0x80000000 152*eef4f27bSRobert Mustacchi 153*eef4f27bSRobert Mustacchi 154*eef4f27bSRobert Mustacchi /* 155*eef4f27bSRobert Mustacchi * EEE control. 156*eef4f27bSRobert Mustacchi */ 157*eef4f27bSRobert Mustacchi 158*eef4f27bSRobert Mustacchi /* 159*eef4f27bSRobert Mustacchi * values match the registry values for EeeCtrlMode . Default is MED 160*eef4f27bSRobert Mustacchi * ("Balanced") 161*eef4f27bSRobert Mustacchi */ 162*eef4f27bSRobert Mustacchi typedef enum 163*eef4f27bSRobert Mustacchi { 164*eef4f27bSRobert Mustacchi LM_EEE_CONTROL_HIGH = 0, // MaxPowerSave 165*eef4f27bSRobert Mustacchi LM_EEE_CONTROL_MED = 1, // Balance 166*eef4f27bSRobert Mustacchi LM_EEE_CONTROL_LOW = 2, // MaxPreformance 167*eef4f27bSRobert Mustacchi LM_EEE_CONTROL_NVRAM = 3, // use NVRAM 168*eef4f27bSRobert Mustacchi LM_EEE_CONTROL_NA = 4 // either N/A or disabled 169*eef4f27bSRobert Mustacchi } lm_eee_policy_t; 170*eef4f27bSRobert Mustacchi 171*eef4f27bSRobert Mustacchi /* 172*eef4f27bSRobert Mustacchi * media type. 173*eef4f27bSRobert Mustacchi */ 174*eef4f27bSRobert Mustacchi 175*eef4f27bSRobert Mustacchi typedef u32_t lm_medium_t; 176*eef4f27bSRobert Mustacchi 177*eef4f27bSRobert Mustacchi #define LM_MEDIUM_AUTO_DETECT 0x0000 178*eef4f27bSRobert Mustacchi 179*eef4f27bSRobert Mustacchi #define LM_MEDIUM_TYPE_UNKNOWN 0x0000 180*eef4f27bSRobert Mustacchi #define LM_MEDIUM_TYPE_BNC 0x0001 181*eef4f27bSRobert Mustacchi #define LM_MEDIUM_TYPE_UTP 0x0002 182*eef4f27bSRobert Mustacchi #define LM_MEDIUM_TYPE_FIBER 0x0003 183*eef4f27bSRobert Mustacchi #define LM_MEDIUM_TYPE_SERDES 0x0004 184*eef4f27bSRobert Mustacchi #define LM_MEDIUM_TYPE_SERDES_SGMII 0x0005 185*eef4f27bSRobert Mustacchi #define LM_MEDIUM_TYPE_XGXS 0x0006 186*eef4f27bSRobert Mustacchi #define LM_MEDIUM_TYPE_XGXS_SGMII 0x0007 187*eef4f27bSRobert Mustacchi #define LM_MEDIUM_TYPE_XMAC_LOOPBACK 0x0008 188*eef4f27bSRobert Mustacchi #define LM_MEDIUM_TYPE_UMAC_LOOPBACK 0x0009 189*eef4f27bSRobert Mustacchi #define LM_MEDIUM_TYPE_EXT_LOOPBACK 0x00f6 190*eef4f27bSRobert Mustacchi #define LM_MEDIUM_TYPE_EXT_PHY_LOOPBACK 0x00f7 191*eef4f27bSRobert Mustacchi #define LM_MEDIUM_TYPE_SERDES_LOOPBACK 0x00f8 192*eef4f27bSRobert Mustacchi #define LM_MEDIUM_TYPE_XGXS_LOOPBACK 0x00f9 193*eef4f27bSRobert Mustacchi #define LM_MEDIUM_TYPE_XGXS_10_LOOPBACK 0x00fa 194*eef4f27bSRobert Mustacchi #define LM_MEDIUM_TYPE_BMAC_LOOPBACK 0x00fb 195*eef4f27bSRobert Mustacchi #define LM_MEDIUM_TYPE_EMAC_LOOPBACK 0x00fc 196*eef4f27bSRobert Mustacchi #define LM_MEDIUM_TYPE_PHY_LOOPBACK 0x00fd 197*eef4f27bSRobert Mustacchi #define LM_MEDIUM_TYPE_MAC_LOOPBACK 0x00fe 198*eef4f27bSRobert Mustacchi #define LM_MEDIUM_TYPE_NULL 0x00ff 199*eef4f27bSRobert Mustacchi #define LM_MEDIUM_TYPE_MASK 0x00ff 200*eef4f27bSRobert Mustacchi #define GET_MEDIUM_TYPE(m) ((m) & LM_MEDIUM_TYPE_MASK) 201*eef4f27bSRobert Mustacchi #define SET_MEDIUM_TYPE(m, t) \ 202*eef4f27bSRobert Mustacchi (m) = ((m) & ~LM_MEDIUM_TYPE_MASK) | (t) 203*eef4f27bSRobert Mustacchi 204*eef4f27bSRobert Mustacchi #define LM_MEDIUM_IS_LOOPBACK(_medium) \ 205*eef4f27bSRobert Mustacchi (((GET_MEDIUM_TYPE(_medium)) == LM_MEDIUM_TYPE_BMAC_LOOPBACK) || \ 206*eef4f27bSRobert Mustacchi ((GET_MEDIUM_TYPE(_medium)) == LM_MEDIUM_TYPE_UMAC_LOOPBACK) || \ 207*eef4f27bSRobert Mustacchi ((GET_MEDIUM_TYPE(_medium)) == LM_MEDIUM_TYPE_XMAC_LOOPBACK) || \ 208*eef4f27bSRobert Mustacchi ((GET_MEDIUM_TYPE(_medium)) == LM_MEDIUM_TYPE_EXT_LOOPBACK) || \ 209*eef4f27bSRobert Mustacchi ((GET_MEDIUM_TYPE(_medium)) == LM_MEDIUM_TYPE_EXT_PHY_LOOPBACK) || \ 210*eef4f27bSRobert Mustacchi ((GET_MEDIUM_TYPE(_medium)) == LM_MEDIUM_TYPE_SERDES_LOOPBACK) || \ 211*eef4f27bSRobert Mustacchi ((GET_MEDIUM_TYPE(_medium)) == LM_MEDIUM_TYPE_XGXS_LOOPBACK) || \ 212*eef4f27bSRobert Mustacchi ((GET_MEDIUM_TYPE(_medium)) == LM_MEDIUM_TYPE_XGXS_10_LOOPBACK) || \ 213*eef4f27bSRobert Mustacchi ((GET_MEDIUM_TYPE(_medium)) == LM_MEDIUM_TYPE_PHY_LOOPBACK) || \ 214*eef4f27bSRobert Mustacchi ((GET_MEDIUM_TYPE(_medium)) == LM_MEDIUM_TYPE_MAC_LOOPBACK)) 215*eef4f27bSRobert Mustacchi 216*eef4f27bSRobert Mustacchi #define LM_MEDIUM_SPEED_AUTONEG 0x0000 217*eef4f27bSRobert Mustacchi 218*eef4f27bSRobert Mustacchi #define LM_MEDIUM_SPEED_UNKNOWN 0x0000 219*eef4f27bSRobert Mustacchi #define LM_MEDIUM_SPEED_10MBPS 0x0100 220*eef4f27bSRobert Mustacchi #define LM_MEDIUM_SPEED_100MBPS 0x0200 221*eef4f27bSRobert Mustacchi #define LM_MEDIUM_SPEED_1000MBPS 0x0300 222*eef4f27bSRobert Mustacchi #define LM_MEDIUM_SPEED_2500MBPS 0x0400 223*eef4f27bSRobert Mustacchi #define LM_MEDIUM_SPEED_10GBPS 0x0600 224*eef4f27bSRobert Mustacchi #define LM_MEDIUM_SPEED_12GBPS 0x0700 225*eef4f27bSRobert Mustacchi #define LM_MEDIUM_SPEED_12_5GBPS 0x0800 226*eef4f27bSRobert Mustacchi #define LM_MEDIUM_SPEED_13GBPS 0x0900 227*eef4f27bSRobert Mustacchi #define LM_MEDIUM_SPEED_15GBPS 0x0a00 228*eef4f27bSRobert Mustacchi #define LM_MEDIUM_SPEED_16GBPS 0x0b00 229*eef4f27bSRobert Mustacchi #define LM_MEDIUM_SPEED_20GBPS 0x0c00 230*eef4f27bSRobert Mustacchi #define LM_MEDIUM_SPEED_25GBPS 0x0d00 231*eef4f27bSRobert Mustacchi #define LM_MEDIUM_SPEED_40GBPS 0x0e00 232*eef4f27bSRobert Mustacchi #define LM_MEDIUM_SPEED_50GBPS 0x0f00 233*eef4f27bSRobert Mustacchi #define LM_MEDIUM_SPEED_SEQ_START 0x1d00 // 100Mbps 234*eef4f27bSRobert Mustacchi #define LM_MEDIUM_SPEED_SEQ_END 0xE400 // 20Gbps 235*eef4f27bSRobert Mustacchi #define LM_MEDIUM_SPEED_AUTONEG_1G_FALLBACK 0xFD00 /* Serdes */ 236*eef4f27bSRobert Mustacchi #define LM_MEDIUM_SPEED_AUTONEG_2_5G_FALLBACK 0xFE00 /* Serdes */ 237*eef4f27bSRobert Mustacchi #define LM_MEDIUM_SPEED_HARDWARE_DEFAULT 0xff00 /* Serdes nvram def. */ 238*eef4f27bSRobert Mustacchi #define LM_MEDIUM_SPEED_MASK 0xff00 239*eef4f27bSRobert Mustacchi #define GET_MEDIUM_SPEED(m) ((m) & LM_MEDIUM_SPEED_MASK) 240*eef4f27bSRobert Mustacchi #define SET_MEDIUM_SPEED(m, s) \ 241*eef4f27bSRobert Mustacchi (m) = ((m) & ~LM_MEDIUM_SPEED_MASK) | (s) 242*eef4f27bSRobert Mustacchi 243*eef4f27bSRobert Mustacchi #define LM_MEDIUM_FULL_DUPLEX 0x00000 244*eef4f27bSRobert Mustacchi #define LM_MEDIUM_HALF_DUPLEX 0x10000 245*eef4f27bSRobert Mustacchi #define GET_MEDIUM_DUPLEX(m) ((m) & LM_MEDIUM_HALF_DUPLEX) 246*eef4f27bSRobert Mustacchi #define SET_MEDIUM_DUPLEX(m, d) \ 247*eef4f27bSRobert Mustacchi (m) = ((m) & ~LM_MEDIUM_HALF_DUPLEX) | (d) 248*eef4f27bSRobert Mustacchi 249*eef4f27bSRobert Mustacchi #define LM_MEDIUM_SELECTIVE_AUTONEG 0x01000000 250*eef4f27bSRobert Mustacchi #define GET_MEDIUM_AUTONEG_MODE(m) ((m) & 0xff000000) 251*eef4f27bSRobert Mustacchi 252*eef4f27bSRobert Mustacchi typedef struct _lm_link_settings_t 253*eef4f27bSRobert Mustacchi { 254*eef4f27bSRobert Mustacchi u32_t flag; 255*eef4f27bSRobert Mustacchi #define LINK_FLAG_SELECTIVE_AUTONEG_MASK 0x0f 256*eef4f27bSRobert Mustacchi #define LINK_FLAG_SELECTIVE_AUTONEG_ONE_SPEED 0x01 257*eef4f27bSRobert Mustacchi #define LINK_FLAG_SELECTIVE_AUTONEG_ENABLE_SLOWER_SPEEDS 0x02 258*eef4f27bSRobert Mustacchi #define LINK_FLAG_WIRE_SPEED 0x10 259*eef4f27bSRobert Mustacchi 260*eef4f27bSRobert Mustacchi lm_medium_t req_medium; 261*eef4f27bSRobert Mustacchi lm_flow_control_t flow_ctrl; 262*eef4f27bSRobert Mustacchi 263*eef4f27bSRobert Mustacchi u32_t _reserved; 264*eef4f27bSRobert Mustacchi } lm_link_settings_t; 265*eef4f27bSRobert Mustacchi 266*eef4f27bSRobert Mustacchi 267*eef4f27bSRobert Mustacchi 268*eef4f27bSRobert Mustacchi /* 269*eef4f27bSRobert Mustacchi * Power state. 270*eef4f27bSRobert Mustacchi */ 271*eef4f27bSRobert Mustacchi 272*eef4f27bSRobert Mustacchi typedef enum 273*eef4f27bSRobert Mustacchi { 274*eef4f27bSRobert Mustacchi LM_POWER_STATE_D0 = 0, 275*eef4f27bSRobert Mustacchi LM_POWER_STATE_D1 = 1, 276*eef4f27bSRobert Mustacchi LM_POWER_STATE_D2 = 2, 277*eef4f27bSRobert Mustacchi LM_POWER_STATE_D3 = 3 278*eef4f27bSRobert Mustacchi } lm_power_state_t; 279*eef4f27bSRobert Mustacchi 280*eef4f27bSRobert Mustacchi 281*eef4f27bSRobert Mustacchi 282*eef4f27bSRobert Mustacchi /* 283*eef4f27bSRobert Mustacchi * offloading. 284*eef4f27bSRobert Mustacchi */ 285*eef4f27bSRobert Mustacchi 286*eef4f27bSRobert Mustacchi typedef u32_t lm_offload_t; 287*eef4f27bSRobert Mustacchi 288*eef4f27bSRobert Mustacchi #define LM_OFFLOAD_NONE 0x00000000 289*eef4f27bSRobert Mustacchi #define LM_OFFLOAD_TX_IP_CKSUM 0x00000001 290*eef4f27bSRobert Mustacchi #define LM_OFFLOAD_RX_IP_CKSUM 0x00000002 291*eef4f27bSRobert Mustacchi #define LM_OFFLOAD_TX_TCP_CKSUM 0x00000004 292*eef4f27bSRobert Mustacchi #define LM_OFFLOAD_RX_TCP_CKSUM 0x00000008 293*eef4f27bSRobert Mustacchi #define LM_OFFLOAD_TX_UDP_CKSUM 0x00000010 294*eef4f27bSRobert Mustacchi #define LM_OFFLOAD_RX_UDP_CKSUM 0x00000020 295*eef4f27bSRobert Mustacchi #define LM_OFFLOAD_IPV4_TCP_LSO 0x00000040 296*eef4f27bSRobert Mustacchi #define LM_OFFLOAD_IPV6_TCP_LSO 0x00000080 297*eef4f27bSRobert Mustacchi #define LM_OFFLOAD_CHIMNEY 0x00000100 298*eef4f27bSRobert Mustacchi #define LM_OFFLOAD_IPV6_CHIMNEY 0x00000200 299*eef4f27bSRobert Mustacchi #define LM_OFFLOAD_TX_TCP6_CKSUM 0x00001000 300*eef4f27bSRobert Mustacchi #define LM_OFFLOAD_RX_TCP6_CKSUM 0x00002000 301*eef4f27bSRobert Mustacchi #define LM_OFFLOAD_TX_UDP6_CKSUM 0x00004000 302*eef4f27bSRobert Mustacchi #define LM_OFFLOAD_RX_UDP6_CKSUM 0x00008000 303*eef4f27bSRobert Mustacchi #define LM_OFFLOAD_RSC_IPV4 0x00010000 304*eef4f27bSRobert Mustacchi #define LM_OFFLOAD_RSC_IPV6 0x00020000 305*eef4f27bSRobert Mustacchi #define LM_OFFLOAD_ENCAP_PACKET 0x00040000 306*eef4f27bSRobert Mustacchi 307*eef4f27bSRobert Mustacchi 308*eef4f27bSRobert Mustacchi 309*eef4f27bSRobert Mustacchi /* 310*eef4f27bSRobert Mustacchi * RSS Hash Types 311*eef4f27bSRobert Mustacchi */ 312*eef4f27bSRobert Mustacchi 313*eef4f27bSRobert Mustacchi typedef u32_t lm_rss_hash_t; 314*eef4f27bSRobert Mustacchi 315*eef4f27bSRobert Mustacchi #define LM_RSS_HASH_IPV4 0x00000100 316*eef4f27bSRobert Mustacchi #define LM_RSS_HASH_TCP_IPV4 0x00000200 317*eef4f27bSRobert Mustacchi #define LM_RSS_HASH_IPV6 0x00000400 318*eef4f27bSRobert Mustacchi #define LM_RSS_HASH_IPV6_EX 0x00000800 319*eef4f27bSRobert Mustacchi #define LM_RSS_HASH_TCP_IPV6 0x00001000 320*eef4f27bSRobert Mustacchi #define LM_RSS_HASH_TCP_IPV6_EX 0x00002000 321*eef4f27bSRobert Mustacchi 322*eef4f27bSRobert Mustacchi 323*eef4f27bSRobert Mustacchi 324*eef4f27bSRobert Mustacchi /* 325*eef4f27bSRobert Mustacchi * Chip reset reasons. 326*eef4f27bSRobert Mustacchi */ 327*eef4f27bSRobert Mustacchi 328*eef4f27bSRobert Mustacchi typedef enum 329*eef4f27bSRobert Mustacchi { 330*eef4f27bSRobert Mustacchi LM_REASON_NONE = 0, 331*eef4f27bSRobert Mustacchi LM_REASON_DRIVER_RESET = 1, 332*eef4f27bSRobert Mustacchi LM_REASON_DRIVER_UNLOAD = 2, 333*eef4f27bSRobert Mustacchi LM_REASON_DRIVER_SHUTDOWN = 3, 334*eef4f27bSRobert Mustacchi LM_REASON_WOL_SUSPEND = 4, 335*eef4f27bSRobert Mustacchi LM_REASON_NO_WOL_SUSPEND = 5, 336*eef4f27bSRobert Mustacchi LM_REASON_DIAG = 6, 337*eef4f27bSRobert Mustacchi /* Power down phy/serdes */ 338*eef4f27bSRobert Mustacchi LM_REASON_DRIVER_UNLOAD_POWER_DOWN = 7, 339*eef4f27bSRobert Mustacchi LM_REASON_ERROR_RECOVERY = 8 340*eef4f27bSRobert Mustacchi } lm_reason_t; 341*eef4f27bSRobert Mustacchi 342*eef4f27bSRobert Mustacchi 343*eef4f27bSRobert Mustacchi 344*eef4f27bSRobert Mustacchi /* 345*eef4f27bSRobert Mustacchi * Wake up mode. 346*eef4f27bSRobert Mustacchi */ 347*eef4f27bSRobert Mustacchi 348*eef4f27bSRobert Mustacchi typedef u32_t lm_wake_up_mode_t; 349*eef4f27bSRobert Mustacchi 350*eef4f27bSRobert Mustacchi #define LM_WAKE_UP_MODE_NONE 0 351*eef4f27bSRobert Mustacchi #define LM_WAKE_UP_MODE_MAGIC_PACKET 1 352*eef4f27bSRobert Mustacchi #define LM_WAKE_UP_MODE_NWUF 2 353*eef4f27bSRobert Mustacchi #define LM_WAKE_UP_MODE_LINK_CHANGE 4 354*eef4f27bSRobert Mustacchi 355*eef4f27bSRobert Mustacchi 356*eef4f27bSRobert Mustacchi 357*eef4f27bSRobert Mustacchi /* 358*eef4f27bSRobert Mustacchi * Event code. 359*eef4f27bSRobert Mustacchi */ 360*eef4f27bSRobert Mustacchi typedef enum 361*eef4f27bSRobert Mustacchi { 362*eef4f27bSRobert Mustacchi LM_EVENT_CODE_LINK_CHANGE = 0, 363*eef4f27bSRobert Mustacchi LM_EVENT_CODE_PAUSE_OFFLOAD = 1, 364*eef4f27bSRobert Mustacchi LM_EVENT_CODE_RESUME_OFFLOAD = 2, 365*eef4f27bSRobert Mustacchi /* For Error Recovery Flow */ 366*eef4f27bSRobert Mustacchi LM_EVENT_CODE_STOP_CHIP_ACCESS = 3, 367*eef4f27bSRobert Mustacchi /* For Error Recovery Flow */ 368*eef4f27bSRobert Mustacchi LM_EVENT_CODE_RESTART_CHIP_ACCESS = 4, 369*eef4f27bSRobert Mustacchi LM_EVENT_CODE_UPLOAD_ALL = 5, 370*eef4f27bSRobert Mustacchi LM_EVENT_CODE_DCBX_OPERA_CHANGE = 6, 371*eef4f27bSRobert Mustacchi LM_EVENT_CODE_DCBX_REMOTE_CHANGE = 7, 372*eef4f27bSRobert Mustacchi LM_EVENT_CODE_INVALIDATE_VF_BLOCK = 8, 373*eef4f27bSRobert Mustacchi } lm_event_code_t; 374*eef4f27bSRobert Mustacchi 375*eef4f27bSRobert Mustacchi 376*eef4f27bSRobert Mustacchi /* 377*eef4f27bSRobert Mustacchi * Transmit control flags. 378*eef4f27bSRobert Mustacchi */ 379*eef4f27bSRobert Mustacchi 380*eef4f27bSRobert Mustacchi typedef u32_t lm_tx_flag_t; 381*eef4f27bSRobert Mustacchi 382*eef4f27bSRobert Mustacchi #define LM_TX_FLAG_INSERT_VLAN_TAG 0x01 383*eef4f27bSRobert Mustacchi #define LM_TX_FLAG_COMPUTE_IP_CKSUM 0x02 384*eef4f27bSRobert Mustacchi #define LM_TX_FLAG_COMPUTE_TCP_UDP_CKSUM 0x04 385*eef4f27bSRobert Mustacchi #define LM_TX_FLAG_TCP_LSO_FRAME 0x08 386*eef4f27bSRobert Mustacchi #define LM_TX_FLAG_TCP_LSO_SNAP_FRAME 0x10 387*eef4f27bSRobert Mustacchi #define LM_TX_FLAG_COAL_NOW 0x20 388*eef4f27bSRobert Mustacchi #define LM_TX_FLAG_DONT_COMPUTE_CRC 0x40 389*eef4f27bSRobert Mustacchi #define LM_TX_FLAG_SKIP_MBQ_WRITE 0x80 390*eef4f27bSRobert Mustacchi #define LM_TX_FLAG_IPV6_PACKET 0x100 391*eef4f27bSRobert Mustacchi #define LM_TX_FLAG_VLAN_TAG_EXISTS 0x200 392*eef4f27bSRobert Mustacchi /* 393*eef4f27bSRobert Mustacchi * If this flag is set, the firmware will ignore global 394*eef4f27bSRobert Mustacchi * configuration (except Outer VLAN)and will handle inner Vlan 395*eef4f27bSRobert Mustacchi * only according to driver instructions on the bd: 396*eef4f27bSRobert Mustacchi * 1. LM_TX_FLAG_VLAN_TAG_EXISTS. 397*eef4f27bSRobert Mustacchi * 2. LM_TX_FLAG_INSERT_VLAN_TAG. 398*eef4f27bSRobert Mustacchi * Note that if set the firmware will not handle default vlan / 399*eef4f27bSRobert Mustacchi * NIV tag / DCB. 400*eef4f27bSRobert Mustacchi */ 401*eef4f27bSRobert Mustacchi #define LM_TX_FLAG_FORCE_VLAN_MODE 0x400 402*eef4f27bSRobert Mustacchi /* Encapsulated packet offload flags. */ 403*eef4f27bSRobert Mustacchi #define LM_TX_FLAG_IS_ENCAP_PACKET 0x800 404*eef4f27bSRobert Mustacchi #define LM_TX_FLAG_ENCAP_PACKET_IS_INNER_IPV6 0x1000 405*eef4f27bSRobert Mustacchi 406*eef4f27bSRobert Mustacchi typedef struct _lm_pkt_tx_info_t 407*eef4f27bSRobert Mustacchi { 408*eef4f27bSRobert Mustacchi lm_tx_flag_t flags; 409*eef4f27bSRobert Mustacchi 410*eef4f27bSRobert Mustacchi u16_t vlan_tag; 411*eef4f27bSRobert Mustacchi u16_t lso_mss; 412*eef4f27bSRobert Mustacchi u16_t lso_ip_hdr_len; 413*eef4f27bSRobert Mustacchi u16_t lso_tcp_hdr_len; 414*eef4f27bSRobert Mustacchi u32_t lso_payload_len; 415*eef4f27bSRobert Mustacchi 416*eef4f27bSRobert Mustacchi /* Everest only fields. */ 417*eef4f27bSRobert Mustacchi u32_t lso_tcp_send_seq; 418*eef4f27bSRobert Mustacchi u16_t lso_ipid; 419*eef4f27bSRobert Mustacchi u16_t tcp_pseudo_csum; 420*eef4f27bSRobert Mustacchi u8_t lso_tcp_flags; 421*eef4f27bSRobert Mustacchi u8_t tcp_nonce_sum_bit; 422*eef4f27bSRobert Mustacchi u16_t fw_ip_csum; 423*eef4f27bSRobert Mustacchi 424*eef4f27bSRobert Mustacchi u8_t dst_mac_addr[8]; 425*eef4f27bSRobert Mustacchi s8_t cs_any_offset; 426*eef4f27bSRobert Mustacchi u8_t src_mac_addr[8]; 427*eef4f27bSRobert Mustacchi u8_t _unused1; 428*eef4f27bSRobert Mustacchi u8_t eth_type[4]; 429*eef4f27bSRobert Mustacchi 430*eef4f27bSRobert Mustacchi /* 431*eef4f27bSRobert Mustacchi * Encapsulated packet offsets. These fields are only valid when 432*eef4f27bSRobert Mustacchi * LM_TX_FLAG_IS_ENCAP_PACKET is set. 433*eef4f27bSRobert Mustacchi */ 434*eef4f27bSRobert Mustacchi u8_t encap_packet_inner_frame_offset; 435*eef4f27bSRobert Mustacchi u8_t encap_packet_inner_ip_relative_offset; 436*eef4f27bSRobert Mustacchi u16_t encap_packet_inner_tcp_relative_offset; 437*eef4f27bSRobert Mustacchi } lm_pkt_tx_info_t; 438*eef4f27bSRobert Mustacchi 439*eef4f27bSRobert Mustacchi 440*eef4f27bSRobert Mustacchi 441*eef4f27bSRobert Mustacchi /* 442*eef4f27bSRobert Mustacchi * Receive control flags. 443*eef4f27bSRobert Mustacchi */ 444*eef4f27bSRobert Mustacchi 445*eef4f27bSRobert Mustacchi typedef u32_t lm_rx_flag_t; 446*eef4f27bSRobert Mustacchi 447*eef4f27bSRobert Mustacchi #define LM_RX_FLAG_VALID_VLAN_TAG 0x00000001 448*eef4f27bSRobert Mustacchi #define LM_RX_FLAG_VALID_HASH_VALUE 0x00000010 449*eef4f27bSRobert Mustacchi 450*eef4f27bSRobert Mustacchi #define LM_RX_FLAG_IS_IPV4_DATAGRAM 0x00000100 451*eef4f27bSRobert Mustacchi #define LM_RX_FLAG_IS_IPV6_DATAGRAM 0x00000200 452*eef4f27bSRobert Mustacchi #define LM_RX_FLAG_IP_CKSUM_IS_GOOD 0x00000400 453*eef4f27bSRobert Mustacchi #define LM_RX_FLAG_IP_CKSUM_IS_BAD 0x00000800 454*eef4f27bSRobert Mustacchi 455*eef4f27bSRobert Mustacchi #define LM_RX_FLAG_IS_UDP_DATAGRAM 0x00001000 456*eef4f27bSRobert Mustacchi #define LM_RX_FLAG_UDP_CKSUM_IS_GOOD 0x00002000 457*eef4f27bSRobert Mustacchi #define LM_RX_FLAG_UDP_CKSUM_IS_BAD 0x00004000 458*eef4f27bSRobert Mustacchi 459*eef4f27bSRobert Mustacchi #define LM_RX_FLAG_IS_TCP_SEGMENT 0x00010000 460*eef4f27bSRobert Mustacchi #define LM_RX_FLAG_TCP_CKSUM_IS_GOOD 0x00020000 461*eef4f27bSRobert Mustacchi #define LM_RX_FLAG_TCP_CKSUM_IS_BAD 0x00040000 462*eef4f27bSRobert Mustacchi #define LM_RX_FLAG_START_RSC_TPA 0x00080000 463*eef4f27bSRobert Mustacchi 464*eef4f27bSRobert Mustacchi #define LM_RX_FLAG_HASH_TYPE_IPV4 0x00100000 465*eef4f27bSRobert Mustacchi #define LM_RX_FLAG_HASH_TYPE_TCP_IPV4 0x00200000 466*eef4f27bSRobert Mustacchi #define LM_RX_FLAG_HASH_TYPE_IPV6 0x00400000 467*eef4f27bSRobert Mustacchi #define LM_RX_FLAG_HASH_TYPE_TCP_IPV6 0x00800000 468*eef4f27bSRobert Mustacchi #define LM_RX_FLAG_HASH_TYPE_MASK 0x00f00000 469*eef4f27bSRobert Mustacchi 470*eef4f27bSRobert Mustacchi typedef struct _lm_pkt_rx_info_t 471*eef4f27bSRobert Mustacchi { 472*eef4f27bSRobert Mustacchi lm_rx_flag_t flags; 473*eef4f27bSRobert Mustacchi 474*eef4f27bSRobert Mustacchi u32_t size; 475*eef4f27bSRobert Mustacchi 476*eef4f27bSRobert Mustacchi u16_t vlan_tag; 477*eef4f27bSRobert Mustacchi u16_t _pad; 478*eef4f27bSRobert Mustacchi 479*eef4f27bSRobert Mustacchi /* 480*eef4f27bSRobert Mustacchi * Virtual address corresponding to the first byte of the first SGL 481*eef4f27bSRobert Mustacchi * entry. This is the starting location of the packet which may begin 482*eef4f27bSRobert Mustacchi * with some control information. 483*eef4f27bSRobert Mustacchi */ 484*eef4f27bSRobert Mustacchi u8_t *mem_virt; 485*eef4f27bSRobert Mustacchi u32_t mem_size; 486*eef4f27bSRobert Mustacchi 487*eef4f27bSRobert Mustacchi /* these fields only valid when LM_RX_FLAG_START_RSC_TPA is set */ 488*eef4f27bSRobert Mustacchi u16_t coal_seg_cnt; 489*eef4f27bSRobert Mustacchi u16_t dup_ack_cnt; 490*eef4f27bSRobert Mustacchi u32_t ts_delta; /* valid when timestamp is enabled */ 491*eef4f27bSRobert Mustacchi /* 492*eef4f27bSRobert Mustacchi * if the packet is RSC, this field will hold the total size of the 493*eef4f27bSRobert Mustacchi * RSC SCU 494*eef4f27bSRobert Mustacchi */ 495*eef4f27bSRobert Mustacchi u32_t total_packet_size; 496*eef4f27bSRobert Mustacchi 497*eef4f27bSRobert Mustacchi u32_t unused; 498*eef4f27bSRobert Mustacchi } lm_pkt_rx_info_t; 499*eef4f27bSRobert Mustacchi 500*eef4f27bSRobert Mustacchi 501*eef4f27bSRobert Mustacchi 502*eef4f27bSRobert Mustacchi /* 503*eef4f27bSRobert Mustacchi * various type of counters. 504*eef4f27bSRobert Mustacchi */ 505*eef4f27bSRobert Mustacchi 506*eef4f27bSRobert Mustacchi typedef enum 507*eef4f27bSRobert Mustacchi { 508*eef4f27bSRobert Mustacchi LM_STATS_BASE = 0x686b3000, 509*eef4f27bSRobert Mustacchi LM_STATS_FRAMES_XMITTED_OK = 0x686b3001, 510*eef4f27bSRobert Mustacchi LM_STATS_FRAMES_RECEIVED_OK = 0x686b3002, 511*eef4f27bSRobert Mustacchi LM_STATS_ERRORED_TRANSMIT_CNT = 0x686b3003, 512*eef4f27bSRobert Mustacchi LM_STATS_ERRORED_RECEIVE_CNT = 0x686b3004, 513*eef4f27bSRobert Mustacchi LM_STATS_RCV_CRC_ERROR = 0x686b3005, 514*eef4f27bSRobert Mustacchi LM_STATS_ALIGNMENT_ERROR = 0x686b3006, 515*eef4f27bSRobert Mustacchi LM_STATS_SINGLE_COLLISION_FRAMES = 0x686b3007, 516*eef4f27bSRobert Mustacchi LM_STATS_MULTIPLE_COLLISION_FRAMES = 0x686b3008, 517*eef4f27bSRobert Mustacchi LM_STATS_FRAMES_DEFERRED = 0x686b3009, 518*eef4f27bSRobert Mustacchi LM_STATS_MAX_COLLISIONS = 0x686b300a, 519*eef4f27bSRobert Mustacchi LM_STATS_RCV_OVERRUN = 0x686b300b, 520*eef4f27bSRobert Mustacchi LM_STATS_XMIT_UNDERRUN = 0x686b300c, 521*eef4f27bSRobert Mustacchi LM_STATS_UNICAST_FRAMES_XMIT = 0x686b300d, 522*eef4f27bSRobert Mustacchi LM_STATS_MULTICAST_FRAMES_XMIT = 0x686b300e, 523*eef4f27bSRobert Mustacchi LM_STATS_BROADCAST_FRAMES_XMIT = 0x686b300f, 524*eef4f27bSRobert Mustacchi LM_STATS_UNICAST_FRAMES_RCV = 0x686b3010, 525*eef4f27bSRobert Mustacchi LM_STATS_MULTICAST_FRAMES_RCV = 0x686b3011, 526*eef4f27bSRobert Mustacchi LM_STATS_BROADCAST_FRAMES_RCV = 0x686b3012, 527*eef4f27bSRobert Mustacchi LM_STATS_RCV_NO_BUFFER_DROP = 0x686b3013, 528*eef4f27bSRobert Mustacchi LM_STATS_BYTES_RCV = 0x686b3014, 529*eef4f27bSRobert Mustacchi LM_STATS_BYTES_XMIT = 0x686b3015, 530*eef4f27bSRobert Mustacchi LM_STATS_IP4_OFFLOAD = 0x686b3016, 531*eef4f27bSRobert Mustacchi LM_STATS_TCP_OFFLOAD = 0x686b3017, 532*eef4f27bSRobert Mustacchi LM_STATS_IF_IN_DISCARDS = 0x686b3018, 533*eef4f27bSRobert Mustacchi LM_STATS_IF_IN_ERRORS = 0x686b3019, 534*eef4f27bSRobert Mustacchi LM_STATS_IF_OUT_ERRORS = 0x686b301a, 535*eef4f27bSRobert Mustacchi LM_STATS_IP6_OFFLOAD = 0x686b301b, 536*eef4f27bSRobert Mustacchi LM_STATS_TCP6_OFFLOAD = 0x686b301c, 537*eef4f27bSRobert Mustacchi LM_STATS_XMIT_DISCARDS = 0x686b301d, 538*eef4f27bSRobert Mustacchi LM_STATS_DIRECTED_BYTES_RCV = 0x686b301e, 539*eef4f27bSRobert Mustacchi LM_STATS_MULTICAST_BYTES_RCV = 0x686b301f, 540*eef4f27bSRobert Mustacchi LM_STATS_BROADCAST_BYTES_RCV = 0x686b3020, 541*eef4f27bSRobert Mustacchi LM_STATS_DIRECTED_BYTES_XMIT = 0x686b3021, 542*eef4f27bSRobert Mustacchi LM_STATS_MULTICAST_BYTES_XMIT = 0x686b3022, 543*eef4f27bSRobert Mustacchi LM_STATS_BROADCAST_BYTES_XMIT = 0x686b3023, 544*eef4f27bSRobert Mustacchi } lm_stats_t; 545*eef4f27bSRobert Mustacchi 546*eef4f27bSRobert Mustacchi #define NUM_OF_LM_STATS 36 547*eef4f27bSRobert Mustacchi 548*eef4f27bSRobert Mustacchi 549*eef4f27bSRobert Mustacchi /* 550*eef4f27bSRobert Mustacchi * 64-bit value. 551*eef4f27bSRobert Mustacchi */ 552*eef4f27bSRobert Mustacchi 553*eef4f27bSRobert Mustacchi typedef union _lm_u64_t 554*eef4f27bSRobert Mustacchi { 555*eef4f27bSRobert Mustacchi struct _lm_u64_as_u32_t 556*eef4f27bSRobert Mustacchi { 557*eef4f27bSRobert Mustacchi #ifdef BIG_ENDIAN_HOST 558*eef4f27bSRobert Mustacchi u32_t high; 559*eef4f27bSRobert Mustacchi u32_t low; 560*eef4f27bSRobert Mustacchi #else 561*eef4f27bSRobert Mustacchi u32_t low; 562*eef4f27bSRobert Mustacchi u32_t high; 563*eef4f27bSRobert Mustacchi #endif 564*eef4f27bSRobert Mustacchi } as_u32; 565*eef4f27bSRobert Mustacchi 566*eef4f27bSRobert Mustacchi u64_t as_u64; 567*eef4f27bSRobert Mustacchi 568*eef4f27bSRobert Mustacchi void *as_ptr; 569*eef4f27bSRobert Mustacchi } lm_u64_t; 570*eef4f27bSRobert Mustacchi 571*eef4f27bSRobert Mustacchi 572*eef4f27bSRobert Mustacchi typedef lm_u64_t lm_address_t; 573*eef4f27bSRobert Mustacchi 574*eef4f27bSRobert Mustacchi 575*eef4f27bSRobert Mustacchi /* 64-bit increment. The second argument is a 32-bit value. */ 576*eef4f27bSRobert Mustacchi #define LM_INC64(result, addend32) \ 577*eef4f27bSRobert Mustacchi { \ 578*eef4f27bSRobert Mustacchi u32_t low; \ 579*eef4f27bSRobert Mustacchi \ 580*eef4f27bSRobert Mustacchi low = (result)->as_u32.low; \ 581*eef4f27bSRobert Mustacchi (result)->as_u32.low += (addend32); \ 582*eef4f27bSRobert Mustacchi if ((result)->as_u32.low < low) \ 583*eef4f27bSRobert Mustacchi { \ 584*eef4f27bSRobert Mustacchi (result)->as_u32.high++; \ 585*eef4f27bSRobert Mustacchi } \ 586*eef4f27bSRobert Mustacchi } 587*eef4f27bSRobert Mustacchi 588*eef4f27bSRobert Mustacchi 589*eef4f27bSRobert Mustacchi /* 64-bit decrement. The second argument is a 32-bit value. */ 590*eef4f27bSRobert Mustacchi #define LM_DEC64(result, addend32) \ 591*eef4f27bSRobert Mustacchi { \ 592*eef4f27bSRobert Mustacchi u32_t low; \ 593*eef4f27bSRobert Mustacchi \ 594*eef4f27bSRobert Mustacchi low = (result)->as_u32.low; \ 595*eef4f27bSRobert Mustacchi (result)->as_u32.low -= (addend32); \ 596*eef4f27bSRobert Mustacchi if ((result)->as_u32.low > low) \ 597*eef4f27bSRobert Mustacchi { \ 598*eef4f27bSRobert Mustacchi (result)->as_u32.high--; \ 599*eef4f27bSRobert Mustacchi } \ 600*eef4f27bSRobert Mustacchi } 601*eef4f27bSRobert Mustacchi 602*eef4f27bSRobert Mustacchi /* 603*eef4f27bSRobert Mustacchi * IP4 and TCP offload stats. 604*eef4f27bSRobert Mustacchi */ 605*eef4f27bSRobert Mustacchi 606*eef4f27bSRobert Mustacchi typedef struct _lm_ip4_offload_stats_t 607*eef4f27bSRobert Mustacchi { 608*eef4f27bSRobert Mustacchi u64_t in_receives; 609*eef4f27bSRobert Mustacchi u64_t in_delivers; 610*eef4f27bSRobert Mustacchi u64_t out_requests; 611*eef4f27bSRobert Mustacchi u32_t in_header_errors; 612*eef4f27bSRobert Mustacchi u32_t in_discards; 613*eef4f27bSRobert Mustacchi u32_t out_discards; 614*eef4f27bSRobert Mustacchi u32_t out_no_routes; 615*eef4f27bSRobert Mustacchi 616*eef4f27bSRobert Mustacchi u32_t _pad[8]; 617*eef4f27bSRobert Mustacchi } lm_ip4_offload_stats_t; 618*eef4f27bSRobert Mustacchi 619*eef4f27bSRobert Mustacchi 620*eef4f27bSRobert Mustacchi typedef struct _lm_tcp_offload_stats_t 621*eef4f27bSRobert Mustacchi { 622*eef4f27bSRobert Mustacchi u64_t in_segments; 623*eef4f27bSRobert Mustacchi u64_t out_segments; 624*eef4f27bSRobert Mustacchi u32_t retran_segments; 625*eef4f27bSRobert Mustacchi u32_t in_errors; 626*eef4f27bSRobert Mustacchi u32_t out_resets; 627*eef4f27bSRobert Mustacchi 628*eef4f27bSRobert Mustacchi u32_t _pad[8]; 629*eef4f27bSRobert Mustacchi } lm_tcp_offload_stats_t; 630*eef4f27bSRobert Mustacchi 631*eef4f27bSRobert Mustacchi 632*eef4f27bSRobert Mustacchi 633*eef4f27bSRobert Mustacchi /* 634*eef4f27bSRobert Mustacchi * Host to network order conversion. 635*eef4f27bSRobert Mustacchi */ 636*eef4f27bSRobert Mustacchi 637*eef4f27bSRobert Mustacchi #ifdef BIG_ENDIAN_HOST 638*eef4f27bSRobert Mustacchi 639*eef4f27bSRobert Mustacchi #ifndef HTON16 640*eef4f27bSRobert Mustacchi #define HTON16(_val16) (_val16) 641*eef4f27bSRobert Mustacchi #endif 642*eef4f27bSRobert Mustacchi #ifndef HTON32 643*eef4f27bSRobert Mustacchi #define HTON32(_val32) (_val32) 644*eef4f27bSRobert Mustacchi #ifndef NTOH16 645*eef4f27bSRobert Mustacchi #endif 646*eef4f27bSRobert Mustacchi #define NTOH16(_val16) (_val16) 647*eef4f27bSRobert Mustacchi #endif 648*eef4f27bSRobert Mustacchi #ifndef NTOH32 649*eef4f27bSRobert Mustacchi #define NTOH32(_val32) (_val32) 650*eef4f27bSRobert Mustacchi #endif 651*eef4f27bSRobert Mustacchi 652*eef4f27bSRobert Mustacchi #else 653*eef4f27bSRobert Mustacchi 654*eef4f27bSRobert Mustacchi #ifndef HTON16 655*eef4f27bSRobert Mustacchi #define HTON16(_val16) (((_val16 & 0xff00) >> 8) | ((_val16 & 0xff) << 8)) 656*eef4f27bSRobert Mustacchi #endif 657*eef4f27bSRobert Mustacchi #ifndef HTON32 658*eef4f27bSRobert Mustacchi #define HTON32(_val32) ((HTON16(_val32) << 16) | (HTON16(_val32 >> 16))) 659*eef4f27bSRobert Mustacchi #endif 660*eef4f27bSRobert Mustacchi #ifndef NTOH16 661*eef4f27bSRobert Mustacchi #define NTOH16(_val16) HTON16(_val16) 662*eef4f27bSRobert Mustacchi #endif 663*eef4f27bSRobert Mustacchi #ifndef NTOH32 664*eef4f27bSRobert Mustacchi #define NTOH32(_val32) HTON32(_val32) 665*eef4f27bSRobert Mustacchi #endif 666*eef4f27bSRobert Mustacchi 667*eef4f27bSRobert Mustacchi #endif 668*eef4f27bSRobert Mustacchi 669*eef4f27bSRobert Mustacchi 670*eef4f27bSRobert Mustacchi 671*eef4f27bSRobert Mustacchi /* 672*eef4f27bSRobert Mustacchi * Fragment structure. 673*eef4f27bSRobert Mustacchi */ 674*eef4f27bSRobert Mustacchi 675*eef4f27bSRobert Mustacchi typedef struct _lm_frag_t 676*eef4f27bSRobert Mustacchi { 677*eef4f27bSRobert Mustacchi lm_address_t addr; 678*eef4f27bSRobert Mustacchi u32_t size; 679*eef4f27bSRobert Mustacchi u32_t _reserved; 680*eef4f27bSRobert Mustacchi } lm_frag_t; 681*eef4f27bSRobert Mustacchi 682*eef4f27bSRobert Mustacchi typedef struct _lm_frag_list_t 683*eef4f27bSRobert Mustacchi { 684*eef4f27bSRobert Mustacchi u32_t cnt; 685*eef4f27bSRobert Mustacchi u32_t size; 686*eef4f27bSRobert Mustacchi 687*eef4f27bSRobert Mustacchi lm_frag_t frag_arr[1]; 688*eef4f27bSRobert Mustacchi } lm_frag_list_t; 689*eef4f27bSRobert Mustacchi 690*eef4f27bSRobert Mustacchi /* a macro for declaring 'lm_frag_list_t' with various array sizes. */ 691*eef4f27bSRobert Mustacchi #define DECLARE_FRAG_LIST_BUFFER_TYPE(_FRAG_LIST_TYPE_NAME, _MAX_FRAG_CNT) \ 692*eef4f27bSRobert Mustacchi typedef struct _##_FRAG_LIST_TYPE_NAME \ 693*eef4f27bSRobert Mustacchi { \ 694*eef4f27bSRobert Mustacchi lm_frag_list_t list; \ 695*eef4f27bSRobert Mustacchi lm_frag_t frag_arr[_MAX_FRAG_CNT-1]; \ 696*eef4f27bSRobert Mustacchi } _FRAG_LIST_TYPE_NAME 697*eef4f27bSRobert Mustacchi 698*eef4f27bSRobert Mustacchi /* 699*eef4f27bSRobert Mustacchi * DCBX indicate event parameters. 700*eef4f27bSRobert Mustacchi */ 701*eef4f27bSRobert Mustacchi typedef enum _dcb_condition_selector_t 702*eef4f27bSRobert Mustacchi { 703*eef4f27bSRobert Mustacchi DCB_CONDITION_RESERVED, 704*eef4f27bSRobert Mustacchi DCB_CONDITION_DEFAULT, 705*eef4f27bSRobert Mustacchi DCB_CONDITION_TCP_PORT, 706*eef4f27bSRobert Mustacchi DCB_CONDITION_UDP_PORT, 707*eef4f27bSRobert Mustacchi DCB_CONDITION_TCP_OR_UDP_PORT, 708*eef4f27bSRobert Mustacchi DCB_CONDITION_ETHERTYPE, 709*eef4f27bSRobert Mustacchi DCB_CONDITION_NETDIRECT_PORT, 710*eef4f27bSRobert Mustacchi DCB_CONDITION_MAX, 711*eef4f27bSRobert Mustacchi }dcb_condition_selector_t; 712*eef4f27bSRobert Mustacchi 713*eef4f27bSRobert Mustacchi typedef enum _action_selector_t 714*eef4f27bSRobert Mustacchi { 715*eef4f27bSRobert Mustacchi DCB_ACTION_PRIORITY, 716*eef4f27bSRobert Mustacchi DCB_ACTION_MAX, 717*eef4f27bSRobert Mustacchi } action_selector_t; 718*eef4f27bSRobert Mustacchi 719*eef4f27bSRobert Mustacchi typedef struct _dcb_classif_elem_t 720*eef4f27bSRobert Mustacchi { 721*eef4f27bSRobert Mustacchi u32_t flags; 722*eef4f27bSRobert Mustacchi #define DCB_CLASSIF_ENFORCED_BY_VBD 0x1 723*eef4f27bSRobert Mustacchi dcb_condition_selector_t condition_selector; 724*eef4f27bSRobert Mustacchi u16_t condition_field; 725*eef4f27bSRobert Mustacchi action_selector_t action_selector; 726*eef4f27bSRobert Mustacchi u16_t action_field; 727*eef4f27bSRobert Mustacchi }dcb_classif_elem_t; 728*eef4f27bSRobert Mustacchi 729*eef4f27bSRobert Mustacchi typedef enum _dcb_classif_version_t 730*eef4f27bSRobert Mustacchi { 731*eef4f27bSRobert Mustacchi DCB_CLASSIFI_VER_SIMPLE_ELEM, 732*eef4f27bSRobert Mustacchi DCB_CLASSIFI_VER_SIMPLE_ELEM_MAX, 733*eef4f27bSRobert Mustacchi }dcb_classif_version_t; 734*eef4f27bSRobert Mustacchi 735*eef4f27bSRobert Mustacchi typedef struct _dcb_classif_params_t 736*eef4f27bSRobert Mustacchi { 737*eef4f27bSRobert Mustacchi u16_t num_classif_elements; 738*eef4f27bSRobert Mustacchi u16_t _pad; 739*eef4f27bSRobert Mustacchi dcb_classif_version_t classif_version; 740*eef4f27bSRobert Mustacchi void *classif_table; 741*eef4f27bSRobert Mustacchi }dcb_classif_params_t; 742*eef4f27bSRobert Mustacchi 743*eef4f27bSRobert Mustacchi typedef struct _dcb_pfc_param_t 744*eef4f27bSRobert Mustacchi { 745*eef4f27bSRobert Mustacchi u32_t pfc_enable; 746*eef4f27bSRobert Mustacchi #define DCB_PFC_MAX_BIT_ENABLE_MASK (0xFF) 747*eef4f27bSRobert Mustacchi }dcb_pfc_param_t; 748*eef4f27bSRobert Mustacchi 749*eef4f27bSRobert Mustacchi typedef enum _tsa_assignment 750*eef4f27bSRobert Mustacchi { 751*eef4f27bSRobert Mustacchi TSA_ASSIGNMENT_DCB_TSA_STRICT, 752*eef4f27bSRobert Mustacchi TSA_ASSIGNMENT_DCB_TSA_CBS, 753*eef4f27bSRobert Mustacchi TSA_ASSIGNMENT_DCB_TSA_ETS, 754*eef4f27bSRobert Mustacchi } tsa_assignment; 755*eef4f27bSRobert Mustacchi 756*eef4f27bSRobert Mustacchi typedef struct _dcb_ets_tsa_param_t 757*eef4f27bSRobert Mustacchi { 758*eef4f27bSRobert Mustacchi u32_t num_traffic_classes; 759*eef4f27bSRobert Mustacchi u8_t priority_assignment_table[8]; 760*eef4f27bSRobert Mustacchi u8_t tc_bw_assignment_table[8]; 761*eef4f27bSRobert Mustacchi tsa_assignment tsa_assignment_table[8]; 762*eef4f27bSRobert Mustacchi } dcb_ets_tsa_param_t; 763*eef4f27bSRobert Mustacchi 764*eef4f27bSRobert Mustacchi typedef struct _dcb_indicate_event_params_t 765*eef4f27bSRobert Mustacchi { 766*eef4f27bSRobert Mustacchi u32_t flags; 767*eef4f27bSRobert Mustacchi #define DCB_PARAMS_ETS_ENABLED 0x00000001 768*eef4f27bSRobert Mustacchi #define DCB_PARAMS_ETS_CHANGED 0x00000002 769*eef4f27bSRobert Mustacchi #define DCB_PARAMS_PFC_ENABLED 0x00000004 770*eef4f27bSRobert Mustacchi #define DCB_PARAMS_PFC_CHANGED 0x00000008 771*eef4f27bSRobert Mustacchi #define DCB_PARAMS_CLASSIF_ENABLED 0x00000020 772*eef4f27bSRobert Mustacchi #define DCB_PARAMS_CLASSIF_CHANGED 0x00000040 773*eef4f27bSRobert Mustacchi #define DCB_PARAMS_WILLING 0x00000080 774*eef4f27bSRobert Mustacchi 775*eef4f27bSRobert Mustacchi dcb_ets_tsa_param_t ets_params; 776*eef4f27bSRobert Mustacchi dcb_pfc_param_t pfc_params; 777*eef4f27bSRobert Mustacchi dcb_classif_params_t classif_params; 778*eef4f27bSRobert Mustacchi u32_t reserved[4]; 779*eef4f27bSRobert Mustacchi } dcb_indicate_event_params_t; 780*eef4f27bSRobert Mustacchi 781*eef4f27bSRobert Mustacchi /* 782*eef4f27bSRobert Mustacchi * Macro fore calculating the address of the base of the structure given its 783*eef4f27bSRobert Mustacchi * type, and an address of a field within the structure. 784*eef4f27bSRobert Mustacchi */ 785*eef4f27bSRobert Mustacchi 786*eef4f27bSRobert Mustacchi #define GET_CONTAINING_RECORD(address, type, field) \ 787*eef4f27bSRobert Mustacchi ((type *)((u8_t *)(address) - (u8_t *)(&((type *)0)->field))) 788*eef4f27bSRobert Mustacchi 789*eef4f27bSRobert Mustacchi 790*eef4f27bSRobert Mustacchi 791*eef4f27bSRobert Mustacchi /* 792*eef4f27bSRobert Mustacchi * Simple macros. 793*eef4f27bSRobert Mustacchi */ 794*eef4f27bSRobert Mustacchi 795*eef4f27bSRobert Mustacchi #define IS_ETH_BROADCAST(eth_addr) \ 796*eef4f27bSRobert Mustacchi (((unsigned char *) (eth_addr))[0] == ((unsigned char) 0xff)) 797*eef4f27bSRobert Mustacchi 798*eef4f27bSRobert Mustacchi #define IS_ETH_MULTICAST(eth_addr) \ 799*eef4f27bSRobert Mustacchi (((unsigned char *) (eth_addr))[0] & ((unsigned char) 0x01)) 800*eef4f27bSRobert Mustacchi 801*eef4f27bSRobert Mustacchi #define IS_ETH_ADDRESS_EQUAL(eth_addr1, eth_addr2) \ 802*eef4f27bSRobert Mustacchi ((((unsigned char *) (eth_addr1))[0] == \ 803*eef4f27bSRobert Mustacchi ((unsigned char *) (eth_addr2))[0]) && \ 804*eef4f27bSRobert Mustacchi (((unsigned char *) (eth_addr1))[1] == \ 805*eef4f27bSRobert Mustacchi ((unsigned char *) (eth_addr2))[1]) && \ 806*eef4f27bSRobert Mustacchi (((unsigned char *) (eth_addr1))[2] == \ 807*eef4f27bSRobert Mustacchi ((unsigned char *) (eth_addr2))[2]) && \ 808*eef4f27bSRobert Mustacchi (((unsigned char *) (eth_addr1))[3] == \ 809*eef4f27bSRobert Mustacchi ((unsigned char *) (eth_addr2))[3]) && \ 810*eef4f27bSRobert Mustacchi (((unsigned char *) (eth_addr1))[4] == \ 811*eef4f27bSRobert Mustacchi ((unsigned char *) (eth_addr2))[4]) && \ 812*eef4f27bSRobert Mustacchi (((unsigned char *) (eth_addr1))[5] == \ 813*eef4f27bSRobert Mustacchi ((unsigned char *) (eth_addr2))[5])) 814*eef4f27bSRobert Mustacchi 815*eef4f27bSRobert Mustacchi #define COPY_ETH_ADDRESS(src, dst) \ 816*eef4f27bSRobert Mustacchi ((unsigned char *) (dst))[0] = ((unsigned char *) (src))[0]; \ 817*eef4f27bSRobert Mustacchi ((unsigned char *) (dst))[1] = ((unsigned char *) (src))[1]; \ 818*eef4f27bSRobert Mustacchi ((unsigned char *) (dst))[2] = ((unsigned char *) (src))[2]; \ 819*eef4f27bSRobert Mustacchi ((unsigned char *) (dst))[3] = ((unsigned char *) (src))[3]; \ 820*eef4f27bSRobert Mustacchi ((unsigned char *) (dst))[4] = ((unsigned char *) (src))[4]; \ 821*eef4f27bSRobert Mustacchi ((unsigned char *) (dst))[5] = ((unsigned char *) (src))[5]; 822*eef4f27bSRobert Mustacchi 823*eef4f27bSRobert Mustacchi #ifdef __cplusplus 824*eef4f27bSRobert Mustacchi } 825*eef4f27bSRobert Mustacchi #endif 826*eef4f27bSRobert Mustacchi 827*eef4f27bSRobert Mustacchi #endif /* _LM_DEFS_H */ 828