1*10253Sxiuyan.wang@Sun.COM /* 2*10253Sxiuyan.wang@Sun.COM * CDDL HEADER START 3*10253Sxiuyan.wang@Sun.COM * 4*10253Sxiuyan.wang@Sun.COM * The contents of this file are subject to the terms of the 5*10253Sxiuyan.wang@Sun.COM * Common Development and Distribution License (the "License"). 6*10253Sxiuyan.wang@Sun.COM * You may not use this file except in compliance with the License. 7*10253Sxiuyan.wang@Sun.COM * 8*10253Sxiuyan.wang@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*10253Sxiuyan.wang@Sun.COM * or http://www.opensolaris.org/os/licensing. 10*10253Sxiuyan.wang@Sun.COM * See the License for the specific language governing permissions 11*10253Sxiuyan.wang@Sun.COM * and limitations under the License. 12*10253Sxiuyan.wang@Sun.COM * 13*10253Sxiuyan.wang@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 14*10253Sxiuyan.wang@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*10253Sxiuyan.wang@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 16*10253Sxiuyan.wang@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 17*10253Sxiuyan.wang@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 18*10253Sxiuyan.wang@Sun.COM * 19*10253Sxiuyan.wang@Sun.COM * CDDL HEADER END 20*10253Sxiuyan.wang@Sun.COM */ 21*10253Sxiuyan.wang@Sun.COM 22*10253Sxiuyan.wang@Sun.COM /* 23*10253Sxiuyan.wang@Sun.COM * Copyright 2007-2009 Myricom, Inc. All rights reserved. 24*10253Sxiuyan.wang@Sun.COM * Use is subject to license terms. 25*10253Sxiuyan.wang@Sun.COM */ 26*10253Sxiuyan.wang@Sun.COM 27*10253Sxiuyan.wang@Sun.COM #ifndef _myri10ge_mcp_h 28*10253Sxiuyan.wang@Sun.COM #define _myri10ge_mcp_h 29*10253Sxiuyan.wang@Sun.COM 30*10253Sxiuyan.wang@Sun.COM #define MXGEFW_VERSION_MAJOR 1 31*10253Sxiuyan.wang@Sun.COM #define MXGEFW_VERSION_MINOR 4 32*10253Sxiuyan.wang@Sun.COM 33*10253Sxiuyan.wang@Sun.COM #ifdef MXGEFW 34*10253Sxiuyan.wang@Sun.COM #ifndef _stdint_h_ 35*10253Sxiuyan.wang@Sun.COM typedef signed char int8_t; 36*10253Sxiuyan.wang@Sun.COM typedef signed short int16_t; 37*10253Sxiuyan.wang@Sun.COM typedef signed int int32_t; 38*10253Sxiuyan.wang@Sun.COM typedef signed long long int64_t; 39*10253Sxiuyan.wang@Sun.COM typedef unsigned char uint8_t; 40*10253Sxiuyan.wang@Sun.COM typedef unsigned short uint16_t; 41*10253Sxiuyan.wang@Sun.COM typedef unsigned int uint32_t; 42*10253Sxiuyan.wang@Sun.COM typedef unsigned long long uint64_t; 43*10253Sxiuyan.wang@Sun.COM #endif 44*10253Sxiuyan.wang@Sun.COM #endif 45*10253Sxiuyan.wang@Sun.COM 46*10253Sxiuyan.wang@Sun.COM /* 8 Bytes */ 47*10253Sxiuyan.wang@Sun.COM struct mcp_dma_addr { 48*10253Sxiuyan.wang@Sun.COM uint32_t high; 49*10253Sxiuyan.wang@Sun.COM uint32_t low; 50*10253Sxiuyan.wang@Sun.COM }; 51*10253Sxiuyan.wang@Sun.COM typedef struct mcp_dma_addr mcp_dma_addr_t; 52*10253Sxiuyan.wang@Sun.COM 53*10253Sxiuyan.wang@Sun.COM /* 4 Bytes */ 54*10253Sxiuyan.wang@Sun.COM struct mcp_slot { 55*10253Sxiuyan.wang@Sun.COM uint16_t checksum; 56*10253Sxiuyan.wang@Sun.COM uint16_t length; 57*10253Sxiuyan.wang@Sun.COM }; 58*10253Sxiuyan.wang@Sun.COM typedef struct mcp_slot mcp_slot_t; 59*10253Sxiuyan.wang@Sun.COM 60*10253Sxiuyan.wang@Sun.COM #ifdef MXGEFW_NDIS 61*10253Sxiuyan.wang@Sun.COM /* 8-byte descriptor, exclusively used by NDIS drivers. */ 62*10253Sxiuyan.wang@Sun.COM struct mcp_slot_8 { 63*10253Sxiuyan.wang@Sun.COM /* Place hash value at the top so it gets written before length. 64*10253Sxiuyan.wang@Sun.COM * The driver polls length. 65*10253Sxiuyan.wang@Sun.COM */ 66*10253Sxiuyan.wang@Sun.COM uint32_t hash; 67*10253Sxiuyan.wang@Sun.COM uint16_t checksum; 68*10253Sxiuyan.wang@Sun.COM uint16_t length; 69*10253Sxiuyan.wang@Sun.COM }; 70*10253Sxiuyan.wang@Sun.COM typedef struct mcp_slot_8 mcp_slot_8_t; 71*10253Sxiuyan.wang@Sun.COM 72*10253Sxiuyan.wang@Sun.COM /* Two bits of length in mcp_slot are used to indicate hash type. */ 73*10253Sxiuyan.wang@Sun.COM #define MXGEFW_RSS_HASH_NULL (0 << 14) /* bit 15:14 = 00 */ 74*10253Sxiuyan.wang@Sun.COM #define MXGEFW_RSS_HASH_IPV4 (1 << 14) /* bit 15:14 = 01 */ 75*10253Sxiuyan.wang@Sun.COM #define MXGEFW_RSS_HASH_TCP_IPV4 (2 << 14) /* bit 15:14 = 10 */ 76*10253Sxiuyan.wang@Sun.COM #define MXGEFW_RSS_HASH_MASK (3 << 14) /* bit 15:14 = 11 */ 77*10253Sxiuyan.wang@Sun.COM #endif 78*10253Sxiuyan.wang@Sun.COM 79*10253Sxiuyan.wang@Sun.COM /* 64 Bytes */ 80*10253Sxiuyan.wang@Sun.COM struct mcp_cmd { 81*10253Sxiuyan.wang@Sun.COM uint32_t cmd; 82*10253Sxiuyan.wang@Sun.COM uint32_t data0; /* will be low portion if data > 32 bits */ 83*10253Sxiuyan.wang@Sun.COM /* 8 */ 84*10253Sxiuyan.wang@Sun.COM uint32_t data1; /* will be high portion if data > 32 bits */ 85*10253Sxiuyan.wang@Sun.COM uint32_t data2; /* currently unused.. */ 86*10253Sxiuyan.wang@Sun.COM /* 16 */ 87*10253Sxiuyan.wang@Sun.COM struct mcp_dma_addr response_addr; 88*10253Sxiuyan.wang@Sun.COM /* 24 */ 89*10253Sxiuyan.wang@Sun.COM uint8_t pad[40]; 90*10253Sxiuyan.wang@Sun.COM }; 91*10253Sxiuyan.wang@Sun.COM typedef struct mcp_cmd mcp_cmd_t; 92*10253Sxiuyan.wang@Sun.COM 93*10253Sxiuyan.wang@Sun.COM /* 8 Bytes */ 94*10253Sxiuyan.wang@Sun.COM struct mcp_cmd_response { 95*10253Sxiuyan.wang@Sun.COM uint32_t data; 96*10253Sxiuyan.wang@Sun.COM uint32_t result; 97*10253Sxiuyan.wang@Sun.COM }; 98*10253Sxiuyan.wang@Sun.COM typedef struct mcp_cmd_response mcp_cmd_response_t; 99*10253Sxiuyan.wang@Sun.COM 100*10253Sxiuyan.wang@Sun.COM 101*10253Sxiuyan.wang@Sun.COM 102*10253Sxiuyan.wang@Sun.COM /* 103*10253Sxiuyan.wang@Sun.COM flags used in mcp_kreq_ether_send_t: 104*10253Sxiuyan.wang@Sun.COM 105*10253Sxiuyan.wang@Sun.COM The SMALL flag is only needed in the first segment. It is raised 106*10253Sxiuyan.wang@Sun.COM for packets that are total less or equal 512 bytes. 107*10253Sxiuyan.wang@Sun.COM 108*10253Sxiuyan.wang@Sun.COM The CKSUM flag must be set in all segments. 109*10253Sxiuyan.wang@Sun.COM 110*10253Sxiuyan.wang@Sun.COM The PADDED flags is set if the packet needs to be padded, and it 111*10253Sxiuyan.wang@Sun.COM must be set for all segments. 112*10253Sxiuyan.wang@Sun.COM 113*10253Sxiuyan.wang@Sun.COM The MXGEFW_FLAGS_ALIGN_ODD must be set if the cumulative 114*10253Sxiuyan.wang@Sun.COM length of all previous segments was odd. 115*10253Sxiuyan.wang@Sun.COM */ 116*10253Sxiuyan.wang@Sun.COM 117*10253Sxiuyan.wang@Sun.COM 118*10253Sxiuyan.wang@Sun.COM #define MXGEFW_FLAGS_SMALL 0x1 119*10253Sxiuyan.wang@Sun.COM #define MXGEFW_FLAGS_TSO_HDR 0x1 120*10253Sxiuyan.wang@Sun.COM #define MXGEFW_FLAGS_FIRST 0x2 121*10253Sxiuyan.wang@Sun.COM #define MXGEFW_FLAGS_ALIGN_ODD 0x4 122*10253Sxiuyan.wang@Sun.COM #define MXGEFW_FLAGS_CKSUM 0x8 123*10253Sxiuyan.wang@Sun.COM #define MXGEFW_FLAGS_TSO_LAST 0x8 124*10253Sxiuyan.wang@Sun.COM #define MXGEFW_FLAGS_NO_TSO 0x10 125*10253Sxiuyan.wang@Sun.COM #define MXGEFW_FLAGS_TSO_CHOP 0x10 126*10253Sxiuyan.wang@Sun.COM #define MXGEFW_FLAGS_TSO_PLD 0x20 127*10253Sxiuyan.wang@Sun.COM 128*10253Sxiuyan.wang@Sun.COM #define MXGEFW_SEND_SMALL_SIZE 1520 129*10253Sxiuyan.wang@Sun.COM #define MXGEFW_MAX_MTU 9400 130*10253Sxiuyan.wang@Sun.COM 131*10253Sxiuyan.wang@Sun.COM union mcp_pso_or_cumlen { 132*10253Sxiuyan.wang@Sun.COM uint16_t pseudo_hdr_offset; 133*10253Sxiuyan.wang@Sun.COM uint16_t cum_len; 134*10253Sxiuyan.wang@Sun.COM }; 135*10253Sxiuyan.wang@Sun.COM typedef union mcp_pso_or_cumlen mcp_pso_or_cumlen_t; 136*10253Sxiuyan.wang@Sun.COM 137*10253Sxiuyan.wang@Sun.COM #define MXGEFW_MAX_SEND_DESC 12 138*10253Sxiuyan.wang@Sun.COM #define MXGEFW_PAD 2 139*10253Sxiuyan.wang@Sun.COM 140*10253Sxiuyan.wang@Sun.COM /* 16 Bytes */ 141*10253Sxiuyan.wang@Sun.COM struct mcp_kreq_ether_send { 142*10253Sxiuyan.wang@Sun.COM uint32_t addr_high; 143*10253Sxiuyan.wang@Sun.COM uint32_t addr_low; 144*10253Sxiuyan.wang@Sun.COM uint16_t pseudo_hdr_offset; 145*10253Sxiuyan.wang@Sun.COM uint16_t length; 146*10253Sxiuyan.wang@Sun.COM uint8_t pad; 147*10253Sxiuyan.wang@Sun.COM uint8_t rdma_count; 148*10253Sxiuyan.wang@Sun.COM uint8_t cksum_offset; /* where to start computing cksum */ 149*10253Sxiuyan.wang@Sun.COM uint8_t flags; /* as defined above */ 150*10253Sxiuyan.wang@Sun.COM }; 151*10253Sxiuyan.wang@Sun.COM typedef struct mcp_kreq_ether_send mcp_kreq_ether_send_t; 152*10253Sxiuyan.wang@Sun.COM 153*10253Sxiuyan.wang@Sun.COM /* 8 Bytes */ 154*10253Sxiuyan.wang@Sun.COM struct mcp_kreq_ether_recv { 155*10253Sxiuyan.wang@Sun.COM uint32_t addr_high; 156*10253Sxiuyan.wang@Sun.COM uint32_t addr_low; 157*10253Sxiuyan.wang@Sun.COM }; 158*10253Sxiuyan.wang@Sun.COM typedef struct mcp_kreq_ether_recv mcp_kreq_ether_recv_t; 159*10253Sxiuyan.wang@Sun.COM 160*10253Sxiuyan.wang@Sun.COM 161*10253Sxiuyan.wang@Sun.COM /* Commands */ 162*10253Sxiuyan.wang@Sun.COM 163*10253Sxiuyan.wang@Sun.COM #define MXGEFW_BOOT_HANDOFF 0xfc0000 164*10253Sxiuyan.wang@Sun.COM #define MXGEFW_BOOT_DUMMY_RDMA 0xfc01c0 165*10253Sxiuyan.wang@Sun.COM 166*10253Sxiuyan.wang@Sun.COM #define MXGEFW_ETH_CMD 0xf80000 167*10253Sxiuyan.wang@Sun.COM #define MXGEFW_ETH_SEND_4 0x200000 168*10253Sxiuyan.wang@Sun.COM #define MXGEFW_ETH_SEND_1 0x240000 169*10253Sxiuyan.wang@Sun.COM #define MXGEFW_ETH_SEND_2 0x280000 170*10253Sxiuyan.wang@Sun.COM #define MXGEFW_ETH_SEND_3 0x2c0000 171*10253Sxiuyan.wang@Sun.COM #define MXGEFW_ETH_RECV_SMALL 0x300000 172*10253Sxiuyan.wang@Sun.COM #define MXGEFW_ETH_RECV_BIG 0x340000 173*10253Sxiuyan.wang@Sun.COM #define MXGEFW_ETH_SEND_GO 0x380000 174*10253Sxiuyan.wang@Sun.COM #define MXGEFW_ETH_SEND_STOP 0x3C0000 175*10253Sxiuyan.wang@Sun.COM 176*10253Sxiuyan.wang@Sun.COM #define MXGEFW_ETH_SEND(n) (0x200000 + (((n) & 0x03) * 0x40000)) 177*10253Sxiuyan.wang@Sun.COM #define MXGEFW_ETH_SEND_OFFSET(n) (MXGEFW_ETH_SEND(n) - MXGEFW_ETH_SEND_4) 178*10253Sxiuyan.wang@Sun.COM 179*10253Sxiuyan.wang@Sun.COM enum myri10ge_mcp_cmd_type { 180*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_NONE = 0, 181*10253Sxiuyan.wang@Sun.COM /* Reset the mcp, it is left in a safe state, waiting 182*10253Sxiuyan.wang@Sun.COM for the driver to set all its parameters */ 183*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_RESET = 1, 184*10253Sxiuyan.wang@Sun.COM 185*10253Sxiuyan.wang@Sun.COM /* get the version number of the current firmware.. 186*10253Sxiuyan.wang@Sun.COM (may be available in the eeprom strings..? */ 187*10253Sxiuyan.wang@Sun.COM MXGEFW_GET_MCP_VERSION = 2, 188*10253Sxiuyan.wang@Sun.COM 189*10253Sxiuyan.wang@Sun.COM 190*10253Sxiuyan.wang@Sun.COM /* Parameters which must be set by the driver before it can 191*10253Sxiuyan.wang@Sun.COM issue MXGEFW_CMD_ETHERNET_UP. They persist until the next 192*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_RESET is issued */ 193*10253Sxiuyan.wang@Sun.COM 194*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_SET_INTRQ_DMA = 3, 195*10253Sxiuyan.wang@Sun.COM /* data0 = LSW of the host address 196*10253Sxiuyan.wang@Sun.COM * data1 = MSW of the host address 197*10253Sxiuyan.wang@Sun.COM * data2 = slice number if multiple slices are used 198*10253Sxiuyan.wang@Sun.COM */ 199*10253Sxiuyan.wang@Sun.COM 200*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_SET_BIG_BUFFER_SIZE = 4, /* in bytes, power of 2 */ 201*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_SET_SMALL_BUFFER_SIZE = 5, /* in bytes */ 202*10253Sxiuyan.wang@Sun.COM 203*10253Sxiuyan.wang@Sun.COM 204*10253Sxiuyan.wang@Sun.COM /* Parameters which refer to lanai SRAM addresses where the 205*10253Sxiuyan.wang@Sun.COM driver must issue PIO writes for various things */ 206*10253Sxiuyan.wang@Sun.COM 207*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_GET_SEND_OFFSET = 6, 208*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_GET_SMALL_RX_OFFSET = 7, 209*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_GET_BIG_RX_OFFSET = 8, 210*10253Sxiuyan.wang@Sun.COM /* data0 = slice number if multiple slices are used */ 211*10253Sxiuyan.wang@Sun.COM 212*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_GET_IRQ_ACK_OFFSET = 9, 213*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_GET_IRQ_DEASSERT_OFFSET = 10, 214*10253Sxiuyan.wang@Sun.COM 215*10253Sxiuyan.wang@Sun.COM /* Parameters which refer to rings stored on the MCP, 216*10253Sxiuyan.wang@Sun.COM and whose size is controlled by the mcp */ 217*10253Sxiuyan.wang@Sun.COM 218*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_GET_SEND_RING_SIZE = 11, /* in bytes */ 219*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_GET_RX_RING_SIZE = 12, /* in bytes */ 220*10253Sxiuyan.wang@Sun.COM 221*10253Sxiuyan.wang@Sun.COM /* Parameters which refer to rings stored in the host, 222*10253Sxiuyan.wang@Sun.COM and whose size is controlled by the host. Note that 223*10253Sxiuyan.wang@Sun.COM all must be physically contiguous and must contain 224*10253Sxiuyan.wang@Sun.COM a power of 2 number of entries. */ 225*10253Sxiuyan.wang@Sun.COM 226*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_SET_INTRQ_SIZE = 13, /* in bytes */ 227*10253Sxiuyan.wang@Sun.COM #define MXGEFW_CMD_SET_INTRQ_SIZE_FLAG_NO_STRICT_SIZE_CHECK (1 << 31) 228*10253Sxiuyan.wang@Sun.COM 229*10253Sxiuyan.wang@Sun.COM /* command to bring ethernet interface up. Above parameters 230*10253Sxiuyan.wang@Sun.COM (plus mtu & mac address) must have been exchanged prior 231*10253Sxiuyan.wang@Sun.COM to issuing this command */ 232*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_ETHERNET_UP = 14, 233*10253Sxiuyan.wang@Sun.COM 234*10253Sxiuyan.wang@Sun.COM /* command to bring ethernet interface down. No further sends 235*10253Sxiuyan.wang@Sun.COM or receives may be processed until an MXGEFW_CMD_ETHERNET_UP 236*10253Sxiuyan.wang@Sun.COM is issued, and all interrupt queues must be flushed prior 237*10253Sxiuyan.wang@Sun.COM to ack'ing this command */ 238*10253Sxiuyan.wang@Sun.COM 239*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_ETHERNET_DOWN = 15, 240*10253Sxiuyan.wang@Sun.COM 241*10253Sxiuyan.wang@Sun.COM /* commands the driver may issue live, without resetting 242*10253Sxiuyan.wang@Sun.COM the nic. Note that increasing the mtu "live" should 243*10253Sxiuyan.wang@Sun.COM only be done if the driver has already supplied buffers 244*10253Sxiuyan.wang@Sun.COM sufficiently large to handle the new mtu. Decreasing 245*10253Sxiuyan.wang@Sun.COM the mtu live is safe */ 246*10253Sxiuyan.wang@Sun.COM 247*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_SET_MTU = 16, 248*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_GET_INTR_COAL_DELAY_OFFSET = 17, /* in microseconds */ 249*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_SET_STATS_INTERVAL = 18, /* in microseconds */ 250*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_SET_STATS_DMA_OBSOLETE = 19, /* replaced by SET_STATS_DMA_V2 */ 251*10253Sxiuyan.wang@Sun.COM 252*10253Sxiuyan.wang@Sun.COM MXGEFW_ENABLE_PROMISC = 20, 253*10253Sxiuyan.wang@Sun.COM MXGEFW_DISABLE_PROMISC = 21, 254*10253Sxiuyan.wang@Sun.COM MXGEFW_SET_MAC_ADDRESS = 22, 255*10253Sxiuyan.wang@Sun.COM 256*10253Sxiuyan.wang@Sun.COM MXGEFW_ENABLE_FLOW_CONTROL = 23, 257*10253Sxiuyan.wang@Sun.COM MXGEFW_DISABLE_FLOW_CONTROL = 24, 258*10253Sxiuyan.wang@Sun.COM 259*10253Sxiuyan.wang@Sun.COM /* do a DMA test 260*10253Sxiuyan.wang@Sun.COM data0,data1 = DMA address 261*10253Sxiuyan.wang@Sun.COM data2 = RDMA length (MSH), WDMA length (LSH) 262*10253Sxiuyan.wang@Sun.COM command return data = repetitions (MSH), 0.5-ms ticks (LSH) 263*10253Sxiuyan.wang@Sun.COM */ 264*10253Sxiuyan.wang@Sun.COM MXGEFW_DMA_TEST = 25, 265*10253Sxiuyan.wang@Sun.COM 266*10253Sxiuyan.wang@Sun.COM MXGEFW_ENABLE_ALLMULTI = 26, 267*10253Sxiuyan.wang@Sun.COM MXGEFW_DISABLE_ALLMULTI = 27, 268*10253Sxiuyan.wang@Sun.COM 269*10253Sxiuyan.wang@Sun.COM /* returns MXGEFW_CMD_ERROR_MULTICAST 270*10253Sxiuyan.wang@Sun.COM if there is no room in the cache 271*10253Sxiuyan.wang@Sun.COM data0,MSH(data1) = multicast group address */ 272*10253Sxiuyan.wang@Sun.COM MXGEFW_JOIN_MULTICAST_GROUP = 28, 273*10253Sxiuyan.wang@Sun.COM /* returns MXGEFW_CMD_ERROR_MULTICAST 274*10253Sxiuyan.wang@Sun.COM if the address is not in the cache, 275*10253Sxiuyan.wang@Sun.COM or is equal to FF-FF-FF-FF-FF-FF 276*10253Sxiuyan.wang@Sun.COM data0,MSH(data1) = multicast group address */ 277*10253Sxiuyan.wang@Sun.COM MXGEFW_LEAVE_MULTICAST_GROUP = 29, 278*10253Sxiuyan.wang@Sun.COM MXGEFW_LEAVE_ALL_MULTICAST_GROUPS = 30, 279*10253Sxiuyan.wang@Sun.COM 280*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_SET_STATS_DMA_V2 = 31, 281*10253Sxiuyan.wang@Sun.COM /* data0, data1 = bus addr, 282*10253Sxiuyan.wang@Sun.COM * data2 = sizeof(struct mcp_irq_data) from driver point of view, allows 283*10253Sxiuyan.wang@Sun.COM * adding new stuff to mcp_irq_data without changing the ABI 284*10253Sxiuyan.wang@Sun.COM * 285*10253Sxiuyan.wang@Sun.COM * If multiple slices are used, data2 contains both the size of the 286*10253Sxiuyan.wang@Sun.COM * structure (in the lower 16 bits) and the slice number 287*10253Sxiuyan.wang@Sun.COM * (in the upper 16 bits). 288*10253Sxiuyan.wang@Sun.COM */ 289*10253Sxiuyan.wang@Sun.COM 290*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_UNALIGNED_TEST = 32, 291*10253Sxiuyan.wang@Sun.COM /* same than DMA_TEST (same args) but abort with UNALIGNED on unaligned 292*10253Sxiuyan.wang@Sun.COM chipset */ 293*10253Sxiuyan.wang@Sun.COM 294*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_UNALIGNED_STATUS = 33, 295*10253Sxiuyan.wang@Sun.COM /* return data = boolean, true if the chipset is known to be unaligned */ 296*10253Sxiuyan.wang@Sun.COM 297*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_ALWAYS_USE_N_BIG_BUFFERS = 34, 298*10253Sxiuyan.wang@Sun.COM /* data0 = number of big buffers to use. It must be 0 or a power of 2. 299*10253Sxiuyan.wang@Sun.COM * 0 indicates that the NIC consumes as many buffers as they are required 300*10253Sxiuyan.wang@Sun.COM * for packet. This is the default behavior. 301*10253Sxiuyan.wang@Sun.COM * A power of 2 number indicates that the NIC always uses the specified 302*10253Sxiuyan.wang@Sun.COM * number of buffers for each big receive packet. 303*10253Sxiuyan.wang@Sun.COM * It is up to the driver to ensure that this value is big enough for 304*10253Sxiuyan.wang@Sun.COM * the NIC to be able to receive maximum-sized packets. 305*10253Sxiuyan.wang@Sun.COM */ 306*10253Sxiuyan.wang@Sun.COM 307*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_GET_MAX_RSS_QUEUES = 35, 308*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_ENABLE_RSS_QUEUES = 36, 309*10253Sxiuyan.wang@Sun.COM /* data0 = number of slices n (0, 1, ..., n-1) to enable 310*10253Sxiuyan.wang@Sun.COM * data1 = interrupt mode | use of multiple transmit queues. 311*10253Sxiuyan.wang@Sun.COM * 0=share one INTx/MSI. 312*10253Sxiuyan.wang@Sun.COM * 1=use one MSI-X per queue. 313*10253Sxiuyan.wang@Sun.COM * If all queues share one interrupt, the driver must have set 314*10253Sxiuyan.wang@Sun.COM * RSS_SHARED_INTERRUPT_DMA before enabling queues. 315*10253Sxiuyan.wang@Sun.COM * 2=enable both receive and send queues. 316*10253Sxiuyan.wang@Sun.COM * Without this bit set, only one send queue (slice 0's send queue) 317*10253Sxiuyan.wang@Sun.COM * is enabled. The receive queues are always enabled. 318*10253Sxiuyan.wang@Sun.COM */ 319*10253Sxiuyan.wang@Sun.COM #define MXGEFW_SLICE_INTR_MODE_SHARED 0x0 320*10253Sxiuyan.wang@Sun.COM #define MXGEFW_SLICE_INTR_MODE_ONE_PER_SLICE 0x1 321*10253Sxiuyan.wang@Sun.COM #define MXGEFW_SLICE_ENABLE_MULTIPLE_TX_QUEUES 0x2 322*10253Sxiuyan.wang@Sun.COM 323*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_GET_RSS_SHARED_INTERRUPT_MASK_OFFSET = 37, 324*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_SET_RSS_SHARED_INTERRUPT_DMA = 38, 325*10253Sxiuyan.wang@Sun.COM /* data0, data1 = bus address lsw, msw */ 326*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_GET_RSS_TABLE_OFFSET = 39, 327*10253Sxiuyan.wang@Sun.COM /* get the offset of the indirection table */ 328*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_SET_RSS_TABLE_SIZE = 40, 329*10253Sxiuyan.wang@Sun.COM /* set the size of the indirection table */ 330*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_GET_RSS_KEY_OFFSET = 41, 331*10253Sxiuyan.wang@Sun.COM /* get the offset of the secret key */ 332*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_RSS_KEY_UPDATED = 42, 333*10253Sxiuyan.wang@Sun.COM /* tell nic that the secret key's been updated */ 334*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_SET_RSS_ENABLE = 43, 335*10253Sxiuyan.wang@Sun.COM /* data0 = enable/disable rss 336*10253Sxiuyan.wang@Sun.COM * 0: disable rss. nic does not distribute receive packets. 337*10253Sxiuyan.wang@Sun.COM * 1: enable rss. nic distributes receive packets among queues. 338*10253Sxiuyan.wang@Sun.COM * data1 = hash type 339*10253Sxiuyan.wang@Sun.COM * 1: IPV4 (required by RSS) 340*10253Sxiuyan.wang@Sun.COM * 2: TCP_IPV4 (required by RSS) 341*10253Sxiuyan.wang@Sun.COM * 3: IPV4 | TCP_IPV4 (required by RSS) 342*10253Sxiuyan.wang@Sun.COM * 4: source port 343*10253Sxiuyan.wang@Sun.COM * 5: source port + destination port 344*10253Sxiuyan.wang@Sun.COM */ 345*10253Sxiuyan.wang@Sun.COM #define MXGEFW_RSS_HASH_TYPE_IPV4 0x1 346*10253Sxiuyan.wang@Sun.COM #define MXGEFW_RSS_HASH_TYPE_TCP_IPV4 0x2 347*10253Sxiuyan.wang@Sun.COM #define MXGEFW_RSS_HASH_TYPE_SRC_PORT 0x4 348*10253Sxiuyan.wang@Sun.COM #define MXGEFW_RSS_HASH_TYPE_SRC_DST_PORT 0x5 349*10253Sxiuyan.wang@Sun.COM #define MXGEFW_RSS_HASH_TYPE_MAX 0x5 350*10253Sxiuyan.wang@Sun.COM 351*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_GET_MAX_TSO6_HDR_SIZE = 44, 352*10253Sxiuyan.wang@Sun.COM /* Return data = the max. size of the entire headers of a IPv6 TSO packet. 353*10253Sxiuyan.wang@Sun.COM * If the header size of a IPv6 TSO packet is larger than the specified 354*10253Sxiuyan.wang@Sun.COM * value, then the driver must not use TSO. 355*10253Sxiuyan.wang@Sun.COM * This size restriction only applies to IPv6 TSO. 356*10253Sxiuyan.wang@Sun.COM * For IPv4 TSO, the maximum size of the headers is fixed, and the NIC 357*10253Sxiuyan.wang@Sun.COM * always has enough header buffer to store maximum-sized headers. 358*10253Sxiuyan.wang@Sun.COM */ 359*10253Sxiuyan.wang@Sun.COM 360*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_SET_TSO_MODE = 45, 361*10253Sxiuyan.wang@Sun.COM /* data0 = TSO mode. 362*10253Sxiuyan.wang@Sun.COM * 0: Linux/FreeBSD style (NIC default) 363*10253Sxiuyan.wang@Sun.COM * 1: NDIS/NetBSD style 364*10253Sxiuyan.wang@Sun.COM */ 365*10253Sxiuyan.wang@Sun.COM #define MXGEFW_TSO_MODE_LINUX 0 366*10253Sxiuyan.wang@Sun.COM #define MXGEFW_TSO_MODE_NDIS 1 367*10253Sxiuyan.wang@Sun.COM 368*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_MDIO_READ = 46, 369*10253Sxiuyan.wang@Sun.COM /* data0 = dev_addr (PMA/PMD or PCS ...), data1 = register/addr */ 370*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_MDIO_WRITE = 47, 371*10253Sxiuyan.wang@Sun.COM /* data0 = dev_addr, data1 = register/addr, data2 = value */ 372*10253Sxiuyan.wang@Sun.COM 373*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_I2C_READ = 48, 374*10253Sxiuyan.wang@Sun.COM /* Starts to get a fresh copy of one byte or of the module i2c table, the 375*10253Sxiuyan.wang@Sun.COM * obtained data is cached inside the xaui-xfi chip : 376*10253Sxiuyan.wang@Sun.COM * data0 : 0 => get one byte, 1=> get 256 bytes 377*10253Sxiuyan.wang@Sun.COM * data1 : If data0 == 0: location to refresh 378*10253Sxiuyan.wang@Sun.COM * bit 7:0 register location 379*10253Sxiuyan.wang@Sun.COM * bit 8:15 is the i2c slave addr (0 is interpreted as 0xA1) 380*10253Sxiuyan.wang@Sun.COM * bit 23:16 is the i2c bus number (for multi-port NICs) 381*10253Sxiuyan.wang@Sun.COM * If data0 == 1: unused 382*10253Sxiuyan.wang@Sun.COM * The operation might take ~1ms for a single byte or ~65ms when refreshing all 256 bytes 383*10253Sxiuyan.wang@Sun.COM * During the i2c operation, MXGEFW_CMD_I2C_READ or MXGEFW_CMD_I2C_BYTE attempts 384*10253Sxiuyan.wang@Sun.COM * will return MXGEFW_CMD_ERROR_BUSY 385*10253Sxiuyan.wang@Sun.COM */ 386*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_I2C_BYTE = 49, 387*10253Sxiuyan.wang@Sun.COM /* Return the last obtained copy of a given byte in the xfp i2c table 388*10253Sxiuyan.wang@Sun.COM * (copy cached during the last relevant MXGEFW_CMD_I2C_READ) 389*10253Sxiuyan.wang@Sun.COM * data0 : index of the desired table entry 390*10253Sxiuyan.wang@Sun.COM * Return data = the byte stored at the requested index in the table 391*10253Sxiuyan.wang@Sun.COM */ 392*10253Sxiuyan.wang@Sun.COM 393*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_GET_VPUMP_OFFSET = 50, 394*10253Sxiuyan.wang@Sun.COM /* Return data = NIC memory offset of mcp_vpump_public_global */ 395*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_RESET_VPUMP = 51, 396*10253Sxiuyan.wang@Sun.COM /* Resets the VPUMP state */ 397*10253Sxiuyan.wang@Sun.COM 398*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_SET_RSS_MCP_SLOT_TYPE = 52, 399*10253Sxiuyan.wang@Sun.COM /* data0 = mcp_slot type to use. 400*10253Sxiuyan.wang@Sun.COM * 0 = the default 4B mcp_slot 401*10253Sxiuyan.wang@Sun.COM * 1 = 8B mcp_slot_8 402*10253Sxiuyan.wang@Sun.COM */ 403*10253Sxiuyan.wang@Sun.COM #define MXGEFW_RSS_MCP_SLOT_TYPE_MIN 0 404*10253Sxiuyan.wang@Sun.COM #define MXGEFW_RSS_MCP_SLOT_TYPE_WITH_HASH 1 405*10253Sxiuyan.wang@Sun.COM 406*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_SET_THROTTLE_FACTOR = 53, 407*10253Sxiuyan.wang@Sun.COM /* set the throttle factor for ethp_z8e 408*10253Sxiuyan.wang@Sun.COM data0 = throttle_factor 409*10253Sxiuyan.wang@Sun.COM throttle_factor = 256 * pcie-raw-speed / tx_speed 410*10253Sxiuyan.wang@Sun.COM tx_speed = 256 * pcie-raw-speed / throttle_factor 411*10253Sxiuyan.wang@Sun.COM 412*10253Sxiuyan.wang@Sun.COM For PCI-E x8: pcie-raw-speed == 16Gb/s 413*10253Sxiuyan.wang@Sun.COM For PCI-E x4: pcie-raw-speed == 8Gb/s 414*10253Sxiuyan.wang@Sun.COM 415*10253Sxiuyan.wang@Sun.COM ex1: throttle_factor == 0x1a0 (416), tx_speed == 1.23GB/s == 9.846 Gb/s 416*10253Sxiuyan.wang@Sun.COM ex2: throttle_factor == 0x200 (512), tx_speed == 1.0GB/s == 8 Gb/s 417*10253Sxiuyan.wang@Sun.COM 418*10253Sxiuyan.wang@Sun.COM with tx_boundary == 2048, max-throttle-factor == 8191 => min-speed == 500Mb/s 419*10253Sxiuyan.wang@Sun.COM with tx_boundary == 4096, max-throttle-factor == 4095 => min-speed == 1Gb/s 420*10253Sxiuyan.wang@Sun.COM */ 421*10253Sxiuyan.wang@Sun.COM 422*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_VPUMP_UP = 54, 423*10253Sxiuyan.wang@Sun.COM /* Allocates VPump Connection, Send Request and Zero copy buffer address tables */ 424*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_GET_VPUMP_CLK = 55, 425*10253Sxiuyan.wang@Sun.COM /* Get the lanai clock */ 426*10253Sxiuyan.wang@Sun.COM 427*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_GET_DCA_OFFSET = 56, 428*10253Sxiuyan.wang@Sun.COM /* offset of dca control for WDMAs */ 429*10253Sxiuyan.wang@Sun.COM 430*10253Sxiuyan.wang@Sun.COM /* VMWare NetQueue commands */ 431*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_NETQ_GET_FILTERS_PER_QUEUE = 57, 432*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_NETQ_ADD_FILTER = 58, 433*10253Sxiuyan.wang@Sun.COM /* data0 = filter_id << 16 | queue << 8 | type */ 434*10253Sxiuyan.wang@Sun.COM /* data1 = MS4 of MAC Addr */ 435*10253Sxiuyan.wang@Sun.COM /* data2 = LS2_MAC << 16 | VLAN_tag */ 436*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_NETQ_DEL_FILTER = 59, 437*10253Sxiuyan.wang@Sun.COM /* data0 = filter_id */ 438*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_NETQ_QUERY1 = 60, 439*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_NETQ_QUERY2 = 61, 440*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_NETQ_QUERY3 = 62, 441*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_NETQ_QUERY4 = 63, 442*10253Sxiuyan.wang@Sun.COM 443*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_RELAX_RXBUFFER_ALIGNMENT = 64, 444*10253Sxiuyan.wang@Sun.COM /* When set, small receive buffers can cross page boundaries. 445*10253Sxiuyan.wang@Sun.COM * Both small and big receive buffers may start at any address. 446*10253Sxiuyan.wang@Sun.COM * This option has performance implications, so use with caution. 447*10253Sxiuyan.wang@Sun.COM */ 448*10253Sxiuyan.wang@Sun.COM }; 449*10253Sxiuyan.wang@Sun.COM typedef enum myri10ge_mcp_cmd_type myri10ge_mcp_cmd_type_t; 450*10253Sxiuyan.wang@Sun.COM 451*10253Sxiuyan.wang@Sun.COM 452*10253Sxiuyan.wang@Sun.COM enum myri10ge_mcp_cmd_status { 453*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_OK = 0, 454*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_UNKNOWN = 1, 455*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_ERROR_RANGE = 2, 456*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_ERROR_BUSY = 3, 457*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_ERROR_EMPTY = 4, 458*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_ERROR_CLOSED = 5, 459*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_ERROR_HASH_ERROR = 6, 460*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_ERROR_BAD_PORT = 7, 461*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_ERROR_RESOURCES = 8, 462*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_ERROR_MULTICAST = 9, 463*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_ERROR_UNALIGNED = 10, 464*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_ERROR_NO_MDIO = 11, 465*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_ERROR_I2C_FAILURE = 12, 466*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_ERROR_I2C_ABSENT = 13, 467*10253Sxiuyan.wang@Sun.COM MXGEFW_CMD_ERROR_BAD_PCIE_LINK = 14 468*10253Sxiuyan.wang@Sun.COM }; 469*10253Sxiuyan.wang@Sun.COM typedef enum myri10ge_mcp_cmd_status myri10ge_mcp_cmd_status_t; 470*10253Sxiuyan.wang@Sun.COM 471*10253Sxiuyan.wang@Sun.COM 472*10253Sxiuyan.wang@Sun.COM #define MXGEFW_OLD_IRQ_DATA_LEN 40 473*10253Sxiuyan.wang@Sun.COM 474*10253Sxiuyan.wang@Sun.COM struct mcp_irq_data { 475*10253Sxiuyan.wang@Sun.COM /* add new counters at the beginning */ 476*10253Sxiuyan.wang@Sun.COM uint32_t future_use[1]; 477*10253Sxiuyan.wang@Sun.COM uint32_t dropped_pause; 478*10253Sxiuyan.wang@Sun.COM uint32_t dropped_unicast_filtered; 479*10253Sxiuyan.wang@Sun.COM uint32_t dropped_bad_crc32; 480*10253Sxiuyan.wang@Sun.COM uint32_t dropped_bad_phy; 481*10253Sxiuyan.wang@Sun.COM uint32_t dropped_multicast_filtered; 482*10253Sxiuyan.wang@Sun.COM /* 40 Bytes */ 483*10253Sxiuyan.wang@Sun.COM uint32_t send_done_count; 484*10253Sxiuyan.wang@Sun.COM 485*10253Sxiuyan.wang@Sun.COM #define MXGEFW_LINK_DOWN 0 486*10253Sxiuyan.wang@Sun.COM #define MXGEFW_LINK_UP 1 487*10253Sxiuyan.wang@Sun.COM #define MXGEFW_LINK_MYRINET 2 488*10253Sxiuyan.wang@Sun.COM #define MXGEFW_LINK_UNKNOWN 3 489*10253Sxiuyan.wang@Sun.COM uint32_t link_up; 490*10253Sxiuyan.wang@Sun.COM uint32_t dropped_link_overflow; 491*10253Sxiuyan.wang@Sun.COM uint32_t dropped_link_error_or_filtered; 492*10253Sxiuyan.wang@Sun.COM uint32_t dropped_runt; 493*10253Sxiuyan.wang@Sun.COM uint32_t dropped_overrun; 494*10253Sxiuyan.wang@Sun.COM uint32_t dropped_no_small_buffer; 495*10253Sxiuyan.wang@Sun.COM uint32_t dropped_no_big_buffer; 496*10253Sxiuyan.wang@Sun.COM uint32_t rdma_tags_available; 497*10253Sxiuyan.wang@Sun.COM 498*10253Sxiuyan.wang@Sun.COM uint8_t tx_stopped; 499*10253Sxiuyan.wang@Sun.COM uint8_t link_down; 500*10253Sxiuyan.wang@Sun.COM uint8_t stats_updated; 501*10253Sxiuyan.wang@Sun.COM uint8_t valid; 502*10253Sxiuyan.wang@Sun.COM }; 503*10253Sxiuyan.wang@Sun.COM typedef struct mcp_irq_data mcp_irq_data_t; 504*10253Sxiuyan.wang@Sun.COM 505*10253Sxiuyan.wang@Sun.COM #ifdef MXGEFW_NDIS 506*10253Sxiuyan.wang@Sun.COM /* Exclusively used by NDIS drivers */ 507*10253Sxiuyan.wang@Sun.COM struct mcp_rss_shared_interrupt { 508*10253Sxiuyan.wang@Sun.COM uint8_t pad[2]; 509*10253Sxiuyan.wang@Sun.COM uint8_t queue; 510*10253Sxiuyan.wang@Sun.COM uint8_t valid; 511*10253Sxiuyan.wang@Sun.COM }; 512*10253Sxiuyan.wang@Sun.COM #endif 513*10253Sxiuyan.wang@Sun.COM 514*10253Sxiuyan.wang@Sun.COM /* definitions for NETQ filter type */ 515*10253Sxiuyan.wang@Sun.COM #define MXGEFW_NETQ_FILTERTYPE_NONE 0 516*10253Sxiuyan.wang@Sun.COM #define MXGEFW_NETQ_FILTERTYPE_MACADDR 1 517*10253Sxiuyan.wang@Sun.COM #define MXGEFW_NETQ_FILTERTYPE_VLAN 2 518*10253Sxiuyan.wang@Sun.COM #define MXGEFW_NETQ_FILTERTYPE_VLANMACADDR 3 519*10253Sxiuyan.wang@Sun.COM 520*10253Sxiuyan.wang@Sun.COM #endif /* _myri10ge_mcp_h */ 521