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