1 | /* |
---|
2 | * Copyright (c) 2007 Mellanox Technologies. All rights reserved. |
---|
3 | * |
---|
4 | * This software is available to you under a choice of one of two |
---|
5 | * licenses. You may choose to be licensed under the terms of the GNU |
---|
6 | * General Public License (GPL) Version 2, available from the file |
---|
7 | * COPYING in the main directory of this source tree, or the |
---|
8 | * OpenIB.org BSD license below: |
---|
9 | * |
---|
10 | * Redistribution and use in source and binary forms, with or |
---|
11 | * without modification, are permitted provided that the following |
---|
12 | * conditions are met: |
---|
13 | * |
---|
14 | * - Redistributions of source code must retain the above |
---|
15 | * copyright notice, this list of conditions and the following |
---|
16 | * disclaimer. |
---|
17 | * |
---|
18 | * - Redistributions in binary form must reproduce the above |
---|
19 | * copyright notice, this list of conditions and the following |
---|
20 | * disclaimer in the documentation and/or other materials |
---|
21 | * provided with the distribution. |
---|
22 | * |
---|
23 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
---|
24 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
---|
25 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
---|
26 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS |
---|
27 | * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN |
---|
28 | * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
---|
29 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
---|
30 | * SOFTWARE. |
---|
31 | * |
---|
32 | */ |
---|
33 | |
---|
34 | FILE_LICENCE ( GPL2_ONLY ); |
---|
35 | |
---|
36 | #ifndef H_MTNIC_IF_DEFS_H |
---|
37 | #define H_MTNIC_IF_DEFS_H |
---|
38 | |
---|
39 | |
---|
40 | |
---|
41 | /* |
---|
42 | * Device setup |
---|
43 | */ |
---|
44 | #define MTNIC_MAX_PORTS 2 |
---|
45 | #define MTNIC_PORT1 0 |
---|
46 | #define MTNIC_PORT2 1 |
---|
47 | #define NUM_TX_RINGS 1 |
---|
48 | #define NUM_RX_RINGS 1 |
---|
49 | #define NUM_CQS (NUM_RX_RINGS + NUM_TX_RINGS) |
---|
50 | #define GO_BIT_TIMEOUT 6000 |
---|
51 | #define TBIT_RETRIES 100 |
---|
52 | #define UNITS_BUFFER_SIZE 8 /* can be configured to 4/8/16 */ |
---|
53 | #define MAX_GAP_PROD_CONS ( UNITS_BUFFER_SIZE / 4 ) |
---|
54 | #define ETH_DEF_LEN 1540 /* 40 bytes used by the card */ |
---|
55 | #define ETH_FCS_LEN 14 |
---|
56 | #define DEF_MTU ETH_DEF_LEN + ETH_FCS_LEN |
---|
57 | #define DEF_IOBUF_SIZE ETH_DEF_LEN |
---|
58 | |
---|
59 | #define MAC_ADDRESS_SIZE 6 |
---|
60 | #define NUM_EQES 16 |
---|
61 | #define ROUND_TO_CHECK 0x400 |
---|
62 | |
---|
63 | #define DELAY_LINK_CHECK 300 |
---|
64 | #define CHECK_LINK_TIMES 7 |
---|
65 | |
---|
66 | |
---|
67 | #define XNOR(x,y) (!(x) == !(y)) |
---|
68 | #define dma_addr_t unsigned long |
---|
69 | #define PAGE_SIZE 4096 |
---|
70 | #define PAGE_MASK (PAGE_SIZE - 1) |
---|
71 | #define MTNIC_MAILBOX_SIZE PAGE_SIZE |
---|
72 | |
---|
73 | |
---|
74 | |
---|
75 | |
---|
76 | /* BITOPS */ |
---|
77 | #define MTNIC_BC_OFF(bc) ((bc) >> 8) |
---|
78 | #define MTNIC_BC_SZ(bc) ((bc) & 0xff) |
---|
79 | #define MTNIC_BC_ONES(size) (~((int)0x80000000 >> (31 - size))) |
---|
80 | #define MTNIC_BC_MASK(bc) \ |
---|
81 | (MTNIC_BC_ONES(MTNIC_BC_SZ(bc)) << MTNIC_BC_OFF(bc)) |
---|
82 | #define MTNIC_BC_VAL(val, bc) \ |
---|
83 | (((val) & MTNIC_BC_ONES(MTNIC_BC_SZ(bc))) << MTNIC_BC_OFF(bc)) |
---|
84 | /* |
---|
85 | * Sub word fields - bit code base extraction/setting etc |
---|
86 | */ |
---|
87 | |
---|
88 | /* Encode two values */ |
---|
89 | #define MTNIC_BC(off, size) ((off << 8) | (size & 0xff)) |
---|
90 | |
---|
91 | /* Get value of field 'bc' from 'x' */ |
---|
92 | #define MTNIC_BC_GET(x, bc) \ |
---|
93 | (((x) >> MTNIC_BC_OFF(bc)) & MTNIC_BC_ONES(MTNIC_BC_SZ(bc))) |
---|
94 | |
---|
95 | /* Set value of field 'bc' of 'x' to 'val' */ |
---|
96 | #define MTNIC_BC_SET(x, val, bc) \ |
---|
97 | ((x) = ((x) & ~MTNIC_BC_MASK(bc)) | MTNIC_BC_VAL(val, bc)) |
---|
98 | |
---|
99 | /* Like MTNIC_BC_SET, except the previous value is assumed to be 0 */ |
---|
100 | #define MTNIC_BC_PUT(x, val, bc) ((x) |= MTNIC_BC_VAL(val, bc)) |
---|
101 | |
---|
102 | |
---|
103 | |
---|
104 | /* |
---|
105 | * Device constants |
---|
106 | */ |
---|
107 | typedef enum mtnic_if_cmd { |
---|
108 | /* NIC commands: */ |
---|
109 | MTNIC_IF_CMD_QUERY_FW = 0x004, /* query FW (size, version, etc) */ |
---|
110 | MTNIC_IF_CMD_MAP_FW = 0xfff, /* map pages for FW image */ |
---|
111 | MTNIC_IF_CMD_RUN_FW = 0xff6, /* run the FW */ |
---|
112 | MTNIC_IF_CMD_QUERY_CAP = 0x001, /* query MTNIC capabilities */ |
---|
113 | MTNIC_IF_CMD_MAP_PAGES = 0x002, /* map physical pages to HW */ |
---|
114 | MTNIC_IF_CMD_OPEN_NIC = 0x003, /* run the firmware */ |
---|
115 | MTNIC_IF_CMD_CONFIG_RX = 0x005, /* general receive configuration */ |
---|
116 | MTNIC_IF_CMD_CONFIG_TX = 0x006, /* general transmit configuration */ |
---|
117 | MTNIC_IF_CMD_CONFIG_INT_FREQ = 0x007, /* interrupt timers freq limits */ |
---|
118 | MTNIC_IF_CMD_HEART_BEAT = 0x008, /* NOP command testing liveliness */ |
---|
119 | MTNIC_IF_CMD_CLOSE_NIC = 0x009, /* release memory and stop the NIC */ |
---|
120 | |
---|
121 | /* Port commands: */ |
---|
122 | MTNIC_IF_CMD_CONFIG_PORT_RSS_STEER = 0x10, /* set RSS mode */ |
---|
123 | MTNIC_IF_CMD_SET_PORT_RSS_INDIRECTION = 0x11, /* set RSS indirection tbl */ |
---|
124 | MTNIC_IF_CMD_CONFIG_PORT_PRIO_STEERING = 0x12, /* set PRIORITY mode */ |
---|
125 | MTNIC_IF_CMD_CONFIG_PORT_ADDR_STEER = 0x13, /* set Address steer mode */ |
---|
126 | MTNIC_IF_CMD_CONFIG_PORT_VLAN_FILTER = 0x14, /* configure VLAN filter */ |
---|
127 | MTNIC_IF_CMD_CONFIG_PORT_MCAST_FILTER = 0x15, /* configure mcast filter */ |
---|
128 | MTNIC_IF_CMD_ENABLE_PORT_MCAST_FILTER = 0x16, /* enable/disable */ |
---|
129 | MTNIC_IF_CMD_SET_PORT_MTU = 0x17, /* set port MTU */ |
---|
130 | MTNIC_IF_CMD_SET_PORT_PROMISCUOUS_MODE = 0x18, /* enable/disable promisc */ |
---|
131 | MTNIC_IF_CMD_SET_PORT_DEFAULT_RING = 0x19, /* set the default ring */ |
---|
132 | MTNIC_IF_CMD_SET_PORT_STATE = 0x1a, /* set link up/down */ |
---|
133 | MTNIC_IF_CMD_DUMP_STAT = 0x1b, /* dump statistics */ |
---|
134 | MTNIC_IF_CMD_ARM_PORT_STATE_EVENT = 0x1c, /* arm the port state event */ |
---|
135 | |
---|
136 | /* Ring / Completion queue commands: */ |
---|
137 | MTNIC_IF_CMD_CONFIG_CQ = 0x20, /* set up completion queue */ |
---|
138 | MTNIC_IF_CMD_CONFIG_RX_RING = 0x21, /* setup Rx ring */ |
---|
139 | MTNIC_IF_CMD_SET_RX_RING_ADDR = 0x22, /* set Rx ring filter by address */ |
---|
140 | MTNIC_IF_CMD_SET_RX_RING_MCAST = 0x23, /* set Rx ring mcast filter */ |
---|
141 | MTNIC_IF_CMD_ARM_RX_RING_WM = 0x24, /* one-time low-watermark INT */ |
---|
142 | MTNIC_IF_CMD_CONFIG_TX_RING = 0x25, /* set up Tx ring */ |
---|
143 | MTNIC_IF_CMD_ENFORCE_TX_RING_ADDR = 0x26, /* setup anti spoofing */ |
---|
144 | MTNIC_IF_CMD_CONFIG_EQ = 0x27, /* config EQ ring */ |
---|
145 | MTNIC_IF_CMD_RELEASE_RESOURCE = 0x28, /* release internal ref to resource */ |
---|
146 | } |
---|
147 | mtnic_if_cmd_t; |
---|
148 | |
---|
149 | |
---|
150 | /** selectors for MTNIC_IF_CMD_QUERY_CAP */ |
---|
151 | typedef enum mtnic_if_caps { |
---|
152 | MTNIC_IF_CAP_MAX_TX_RING_PER_PORT = 0x0, |
---|
153 | MTNIC_IF_CAP_MAX_RX_RING_PER_PORT = 0x1, |
---|
154 | MTNIC_IF_CAP_MAX_CQ_PER_PORT = 0x2, |
---|
155 | MTNIC_IF_CAP_NUM_PORTS = 0x3, |
---|
156 | MTNIC_IF_CAP_MAX_TX_DESC = 0x4, |
---|
157 | MTNIC_IF_CAP_MAX_RX_DESC = 0x5, |
---|
158 | MTNIC_IF_CAP_MAX_CQES = 0x6, |
---|
159 | MTNIC_IF_CAP_MAX_TX_SG_ENTRIES = 0x7, |
---|
160 | MTNIC_IF_CAP_MAX_RX_SG_ENTRIES = 0x8, |
---|
161 | MTNIC_IF_CAP_MEM_KEY = 0x9, /* key to mem (after map_pages) */ |
---|
162 | MTNIC_IF_CAP_RSS_HASH_TYPE = 0xa, /* one of mtnic_if_rss_types_t */ |
---|
163 | MTNIC_IF_CAP_MAX_PORT_UCAST_ADDR = 0xc, |
---|
164 | MTNIC_IF_CAP_MAX_RING_UCAST_ADDR = 0xd, /* only for ADDR steer */ |
---|
165 | MTNIC_IF_CAP_MAX_PORT_MCAST_ADDR = 0xe, |
---|
166 | MTNIC_IF_CAP_MAX_RING_MCAST_ADDR = 0xf, /* only for ADDR steer */ |
---|
167 | MTNIC_IF_CAP_INTA = 0x10, |
---|
168 | MTNIC_IF_CAP_BOARD_ID_LOW = 0x11, |
---|
169 | MTNIC_IF_CAP_BOARD_ID_HIGH = 0x12, |
---|
170 | MTNIC_IF_CAP_TX_CQ_DB_OFFSET = 0x13, /* offset in bytes for TX, CQ doorbell record */ |
---|
171 | MTNIC_IF_CAP_EQ_DB_OFFSET = 0x14, /* offset in bytes for EQ doorbell record */ |
---|
172 | |
---|
173 | /* These are per port - using port number from cap modifier field */ |
---|
174 | MTNIC_IF_CAP_SPEED = 0x20, |
---|
175 | MTNIC_IF_CAP_DEFAULT_MAC = 0x21, |
---|
176 | MTNIC_IF_CAP_EQ_OFFSET = 0x22, |
---|
177 | MTNIC_IF_CAP_CQ_OFFSET = 0x23, |
---|
178 | MTNIC_IF_CAP_TX_OFFSET = 0x24, |
---|
179 | MTNIC_IF_CAP_RX_OFFSET = 0x25, |
---|
180 | |
---|
181 | } mtnic_if_caps_t; |
---|
182 | |
---|
183 | typedef enum mtnic_if_steer_types { |
---|
184 | MTNIC_IF_STEER_NONE = 0, |
---|
185 | MTNIC_IF_STEER_PRIORITY = 1, |
---|
186 | MTNIC_IF_STEER_RSS = 2, |
---|
187 | MTNIC_IF_STEER_ADDRESS = 3, |
---|
188 | } mtnic_if_steer_types_t; |
---|
189 | |
---|
190 | /** types of memory access modes */ |
---|
191 | typedef enum mtnic_if_memory_types { |
---|
192 | MTNIC_IF_MEM_TYPE_SNOOP = 1, |
---|
193 | MTNIC_IF_MEM_TYPE_NO_SNOOP = 2 |
---|
194 | } mtnic_if_memory_types_t; |
---|
195 | |
---|
196 | |
---|
197 | enum { |
---|
198 | MTNIC_HCR_BASE = 0x1f000, |
---|
199 | MTNIC_HCR_SIZE = 0x0001c, |
---|
200 | MTNIC_CLR_INT_SIZE = 0x00008, |
---|
201 | }; |
---|
202 | |
---|
203 | #define MTNIC_RESET_OFFSET 0xF0010 |
---|
204 | |
---|
205 | |
---|
206 | |
---|
207 | /******************************************************************** |
---|
208 | * Device private data structures |
---|
209 | * |
---|
210 | * This section contains structures of all device private data: |
---|
211 | * descriptors, rings, CQs, EQ .... |
---|
212 | * |
---|
213 | * |
---|
214 | *********************************************************************/ |
---|
215 | /* |
---|
216 | * Descriptor format |
---|
217 | */ |
---|
218 | struct mtnic_ctrl_seg { |
---|
219 | u32 op_own; |
---|
220 | #define MTNIC_BIT_DESC_OWN 0x80000000 |
---|
221 | #define MTNIC_OPCODE_SEND 0xa |
---|
222 | u32 size_vlan; |
---|
223 | u32 flags; |
---|
224 | #define MTNIC_BIT_NO_ICRC 0x2 |
---|
225 | #define MTNIC_BIT_TX_COMP 0xc |
---|
226 | u32 reserved; |
---|
227 | }; |
---|
228 | |
---|
229 | struct mtnic_data_seg { |
---|
230 | u32 count; |
---|
231 | #define MTNIC_INLINE 0x80000000 |
---|
232 | u32 mem_type; |
---|
233 | #define MTNIC_MEMTYPE_PAD 0x100 |
---|
234 | u32 addr_h; |
---|
235 | u32 addr_l; |
---|
236 | }; |
---|
237 | |
---|
238 | struct mtnic_tx_desc { |
---|
239 | struct mtnic_ctrl_seg ctrl; |
---|
240 | struct mtnic_data_seg data; /* at least one data segment */ |
---|
241 | }; |
---|
242 | |
---|
243 | struct mtnic_rx_desc { |
---|
244 | u16 reserved1; |
---|
245 | u16 next; |
---|
246 | u32 reserved2[3]; |
---|
247 | struct mtnic_data_seg data; /* actual number of entries depends on |
---|
248 | * rx ring stride */ |
---|
249 | }; |
---|
250 | |
---|
251 | /* |
---|
252 | * Rings |
---|
253 | */ |
---|
254 | struct mtnic_rx_db_record { |
---|
255 | u32 count; |
---|
256 | }; |
---|
257 | |
---|
258 | struct mtnic_ring { |
---|
259 | u32 size; /* REMOVE ____cacheline_aligned_in_smp; *//* number of Rx descs or TXBBs */ |
---|
260 | u32 size_mask; |
---|
261 | u16 stride; |
---|
262 | u16 cq; /* index of port CQ associated with this ring */ |
---|
263 | u32 prod; |
---|
264 | u32 cons; /* holds the last consumed index */ |
---|
265 | |
---|
266 | /* Buffers */ |
---|
267 | u32 buf_size; /* ring buffer size in bytes */ |
---|
268 | dma_addr_t dma; |
---|
269 | void *buf; |
---|
270 | struct io_buffer *iobuf[UNITS_BUFFER_SIZE]; |
---|
271 | |
---|
272 | /* Tx only */ |
---|
273 | struct mtnic_txcq_db *txcq_db; |
---|
274 | u32 db_offset; |
---|
275 | |
---|
276 | /* Rx ring only */ |
---|
277 | dma_addr_t iobuf_dma; |
---|
278 | struct mtnic_rx_db_record *db; |
---|
279 | dma_addr_t db_dma; |
---|
280 | }; |
---|
281 | |
---|
282 | /* |
---|
283 | * CQ |
---|
284 | */ |
---|
285 | |
---|
286 | struct mtnic_cqe { |
---|
287 | u8 vp; /* VLAN present */ |
---|
288 | u8 reserved1[3]; |
---|
289 | u32 rss_hash; |
---|
290 | u32 reserved2; |
---|
291 | u16 vlan_prio; |
---|
292 | u16 reserved3; |
---|
293 | u8 flags_h; |
---|
294 | u8 flags_l_rht; |
---|
295 | u8 ipv6_mask; |
---|
296 | u8 enc_bf; |
---|
297 | #define MTNIC_BIT_BAD_FCS 0x10 |
---|
298 | #define MTNIC_OPCODE_ERROR 0x1e |
---|
299 | u32 byte_cnt; |
---|
300 | u16 index; |
---|
301 | u16 chksum; |
---|
302 | u8 reserved4[3]; |
---|
303 | u8 op_tr_own; |
---|
304 | #define MTNIC_BIT_CQ_OWN 0x80 |
---|
305 | }; |
---|
306 | |
---|
307 | |
---|
308 | struct mtnic_cq_db_record { |
---|
309 | u32 update_ci; |
---|
310 | u32 cmd_ci; |
---|
311 | }; |
---|
312 | |
---|
313 | struct mtnic_cq { |
---|
314 | int num; /* CQ number (on attached port) */ |
---|
315 | u32 size; /* number of CQEs in CQ */ |
---|
316 | u32 last; /* number of CQEs consumed */ |
---|
317 | struct mtnic_cq_db_record *db; |
---|
318 | struct net_device *dev; |
---|
319 | |
---|
320 | dma_addr_t db_dma; |
---|
321 | u8 is_rx; |
---|
322 | u16 ring; /* ring associated with this CQ */ |
---|
323 | u32 offset_ind; |
---|
324 | |
---|
325 | /* CQE ring */ |
---|
326 | u32 buf_size; /* ring size in bytes */ |
---|
327 | struct mtnic_cqe *buf; |
---|
328 | dma_addr_t dma; |
---|
329 | }; |
---|
330 | |
---|
331 | /* |
---|
332 | * EQ |
---|
333 | */ |
---|
334 | |
---|
335 | struct mtnic_eqe { |
---|
336 | u8 reserved1; |
---|
337 | u8 type; |
---|
338 | u8 reserved2; |
---|
339 | u8 subtype; |
---|
340 | u8 reserved3[3]; |
---|
341 | u8 ring_cq; |
---|
342 | u32 reserved4; |
---|
343 | u8 port; |
---|
344 | #define MTNIC_MASK_EQE_PORT MTNIC_BC(4,2) |
---|
345 | u8 reserved5[2]; |
---|
346 | u8 syndrome; |
---|
347 | u8 reserved6[15]; |
---|
348 | u8 own; |
---|
349 | #define MTNIC_BIT_EQE_OWN 0x80 |
---|
350 | }; |
---|
351 | |
---|
352 | struct mtnic_eq { |
---|
353 | u32 size; /* number of EQEs in ring */ |
---|
354 | u32 buf_size; /* EQ size in bytes */ |
---|
355 | void *buf; |
---|
356 | dma_addr_t dma; |
---|
357 | }; |
---|
358 | |
---|
359 | enum mtnic_state { |
---|
360 | CARD_DOWN, |
---|
361 | CARD_INITIALIZED, |
---|
362 | CARD_UP, |
---|
363 | CARD_LINK_DOWN, |
---|
364 | }; |
---|
365 | |
---|
366 | /* FW */ |
---|
367 | struct mtnic_pages { |
---|
368 | u32 num; |
---|
369 | u32 *buf; |
---|
370 | }; |
---|
371 | struct mtnic_err_buf { |
---|
372 | u64 offset; |
---|
373 | u32 size; |
---|
374 | }; |
---|
375 | |
---|
376 | |
---|
377 | |
---|
378 | struct mtnic_cmd { |
---|
379 | void *buf; |
---|
380 | unsigned long mapping; |
---|
381 | u32 tbit; |
---|
382 | }; |
---|
383 | |
---|
384 | |
---|
385 | struct mtnic_txcq_db { |
---|
386 | u32 reserved1[5]; |
---|
387 | u32 send_db; |
---|
388 | u32 reserved2[2]; |
---|
389 | u32 cq_arm; |
---|
390 | u32 cq_ci; |
---|
391 | }; |
---|
392 | |
---|
393 | |
---|
394 | |
---|
395 | /* |
---|
396 | * Device private data |
---|
397 | * |
---|
398 | */ |
---|
399 | struct mtnic { |
---|
400 | struct net_device *netdev[MTNIC_MAX_PORTS]; |
---|
401 | struct mtnic_if_cmd_reg *hcr; |
---|
402 | struct mtnic_cmd cmd; |
---|
403 | struct pci_device *pdev; |
---|
404 | |
---|
405 | struct mtnic_eq eq; |
---|
406 | u32 *eq_db; |
---|
407 | |
---|
408 | /* Firmware and board info */ |
---|
409 | u64 fw_ver; |
---|
410 | struct { |
---|
411 | struct mtnic_pages fw_pages; |
---|
412 | struct mtnic_pages extra_pages; |
---|
413 | struct mtnic_err_buf err_buf; |
---|
414 | u16 ifc_rev; |
---|
415 | u8 num_ports; |
---|
416 | u64 mac[MTNIC_MAX_PORTS]; |
---|
417 | u16 cq_offset; |
---|
418 | u16 tx_offset[MTNIC_MAX_PORTS]; |
---|
419 | u16 rx_offset[MTNIC_MAX_PORTS]; |
---|
420 | u32 mem_type_snoop_be; |
---|
421 | u32 txcq_db_offset; |
---|
422 | u32 eq_db_offset; |
---|
423 | } fw; |
---|
424 | }; |
---|
425 | |
---|
426 | |
---|
427 | |
---|
428 | |
---|
429 | |
---|
430 | struct mtnic_port { |
---|
431 | |
---|
432 | struct mtnic *mtnic; |
---|
433 | u8 port; |
---|
434 | |
---|
435 | enum mtnic_state state; |
---|
436 | |
---|
437 | /* TX, RX, CQs, EQ */ |
---|
438 | struct mtnic_ring tx_ring; |
---|
439 | struct mtnic_ring rx_ring; |
---|
440 | struct mtnic_cq cq[NUM_CQS]; |
---|
441 | u32 poll_counter; |
---|
442 | struct net_device *netdev; |
---|
443 | |
---|
444 | |
---|
445 | }; |
---|
446 | |
---|
447 | |
---|
448 | |
---|
449 | |
---|
450 | |
---|
451 | |
---|
452 | |
---|
453 | |
---|
454 | |
---|
455 | |
---|
456 | |
---|
457 | |
---|
458 | /*************************************************************************** |
---|
459 | * NIC COMMANDS |
---|
460 | * |
---|
461 | * The section below provides struct definition for commands parameters, |
---|
462 | * and arguments values enumeration. |
---|
463 | * |
---|
464 | * The format used for the struct names is: |
---|
465 | * mtnic_if_<cmd name>_<in|out>_<imm|mbox> |
---|
466 | * |
---|
467 | ***************************************************************************/ |
---|
468 | /** |
---|
469 | * Command Register (Command interface) |
---|
470 | */ |
---|
471 | struct mtnic_if_cmd_reg { |
---|
472 | unsigned long in_param_h; |
---|
473 | u32 in_param_l; |
---|
474 | u32 input_modifier; |
---|
475 | u32 out_param_h; |
---|
476 | u32 out_param_l; |
---|
477 | u32 token; |
---|
478 | #define MTNIC_MASK_CMD_REG_TOKEN MTNIC_BC(16,32) |
---|
479 | u32 status_go_opcode; |
---|
480 | #define MTNIC_MASK_CMD_REG_OPCODE MTNIC_BC(0,16) |
---|
481 | #define MTNIC_MASK_CMD_REG_T_BIT MTNIC_BC(21,1) |
---|
482 | #define MTNIC_MASK_CMD_REG_GO_BIT MTNIC_BC(23,1) |
---|
483 | #define MTNIC_MASK_CMD_REG_STATUS MTNIC_BC(24,8) |
---|
484 | }; |
---|
485 | |
---|
486 | |
---|
487 | |
---|
488 | /* CMD QUERY_FW */ |
---|
489 | struct mtnic_if_query_fw_out_mbox { |
---|
490 | u16 fw_pages; /* Total number of memory pages the device requires */ |
---|
491 | u16 rev_maj; |
---|
492 | u16 rev_smin; |
---|
493 | u16 rev_min; |
---|
494 | u16 reserved1; |
---|
495 | u16 ifc_rev; /* major revision of the command interface */ |
---|
496 | u8 ft; |
---|
497 | u8 reserved2[3]; |
---|
498 | u32 reserved3[4]; |
---|
499 | u64 clr_int_base; |
---|
500 | u32 reserved4[2]; |
---|
501 | u64 err_buf_start; |
---|
502 | u32 err_buf_size; |
---|
503 | }; |
---|
504 | |
---|
505 | /* CMD MTNIC_IF_CMD_QUERY_CAP */ |
---|
506 | struct mtnic_if_query_cap_in_imm { |
---|
507 | u16 reserved1; |
---|
508 | u8 cap_modifier; /* a modifier for the particular capability */ |
---|
509 | u8 cap_index; /* the index of the capability queried */ |
---|
510 | u32 reserved2; |
---|
511 | }; |
---|
512 | |
---|
513 | /* CMD OPEN_NIC */ |
---|
514 | struct mtnic_if_open_nic_in_mbox { |
---|
515 | u16 reserved1; |
---|
516 | u16 mkey; /* number of mem keys for all chip*/ |
---|
517 | u32 mkey_entry; /* mem key entries for each key*/ |
---|
518 | u8 log_rx_p1; /* log2 rx rings for port1 */ |
---|
519 | u8 log_cq_p1; /* log2 cq for port1 */ |
---|
520 | u8 log_tx_p1; /* log2 tx rings for port1 */ |
---|
521 | u8 steer_p1; /* port 1 steering mode */ |
---|
522 | u16 reserved2; |
---|
523 | u8 log_vlan_p1; /* log2 vlan per rx port1 */ |
---|
524 | u8 log_mac_p1; /* log2 mac per rx port1 */ |
---|
525 | |
---|
526 | u8 log_rx_p2; /* log2 rx rings for port1 */ |
---|
527 | u8 log_cq_p2; /* log2 cq for port1 */ |
---|
528 | u8 log_tx_p2; /* log2 tx rings for port1 */ |
---|
529 | u8 steer_p2; /* port 1 steering mode */ |
---|
530 | u16 reserved3; |
---|
531 | u8 log_vlan_p2; /* log2 vlan per rx port1 */ |
---|
532 | u8 log_mac_p2; /* log2 mac per rx port1 */ |
---|
533 | }; |
---|
534 | |
---|
535 | |
---|
536 | /* CMD CONFIG_RX */ |
---|
537 | struct mtnic_if_config_rx_in_imm { |
---|
538 | u16 spkt_size; /* size of small packets interrupts enabled on CQ */ |
---|
539 | u16 resp_rcv_pause_frm_mcast_vlan_comp; /* Two flags see MASK below */ |
---|
540 | /* Enable response to receive pause frames */ |
---|
541 | /* Use VLAN in exact-match multicast checks (see SET_RX_RING_MCAST) */ |
---|
542 | }; |
---|
543 | |
---|
544 | /* CMD CONFIG_TX */ |
---|
545 | struct mtnic_if_config_send_in_imm { |
---|
546 | u32 enph_gpf; /* Enable PseudoHeader and GeneratePauseFrames flags */ |
---|
547 | u32 reserved; |
---|
548 | }; |
---|
549 | |
---|
550 | /* CMD HEART_BEAT */ |
---|
551 | struct mtnic_if_heart_beat_out_imm { |
---|
552 | u32 flags; /* several flags */ |
---|
553 | #define MTNIC_MASK_HEAR_BEAT_INT_ERROR MTNIC_BC(31,1) |
---|
554 | u32 reserved; |
---|
555 | }; |
---|
556 | |
---|
557 | |
---|
558 | /* |
---|
559 | * PORT COMMANDS |
---|
560 | */ |
---|
561 | /* CMD CONFIG_PORT_VLAN_FILTER */ |
---|
562 | /* in mbox is a 4K bits mask - bit per VLAN */ |
---|
563 | struct mtnic_if_config_port_vlan_filter_in_mbox { |
---|
564 | u64 filter[64]; /* vlans[63:0] sit in filter[0], vlans[127:64] sit in filter[1] .. */ |
---|
565 | }; |
---|
566 | |
---|
567 | |
---|
568 | /* CMD SET_PORT_MTU */ |
---|
569 | struct mtnic_if_set_port_mtu_in_imm { |
---|
570 | u16 reserved1; |
---|
571 | u16 mtu; /* The MTU of the port in bytes */ |
---|
572 | u32 reserved2; |
---|
573 | }; |
---|
574 | |
---|
575 | /* CMD SET_PORT_DEFAULT_RING */ |
---|
576 | struct mtnic_if_set_port_default_ring_in_imm { |
---|
577 | u8 reserved1[3]; |
---|
578 | u8 ring; /* Index of ring that collects promiscuous traffic */ |
---|
579 | u32 reserved2; |
---|
580 | }; |
---|
581 | |
---|
582 | /* CMD SET_PORT_STATE */ |
---|
583 | struct mtnic_if_set_port_state_in_imm { |
---|
584 | u32 state; /* if 1 the port state should be up */ |
---|
585 | #define MTNIC_MASK_CONFIG_PORT_STATE MTNIC_BC(0,1) |
---|
586 | u32 reserved; |
---|
587 | }; |
---|
588 | |
---|
589 | /* CMD CONFIG_CQ */ |
---|
590 | struct mtnic_if_config_cq_in_mbox { |
---|
591 | u8 reserved1; |
---|
592 | u8 cq; |
---|
593 | u8 size; /* Num CQs is 2^size (size <= 22) */ |
---|
594 | u8 offset; /* start address of CQE in first page (11:6) */ |
---|
595 | u16 tlast; /* interrupt moderation timer from last completion usec */ |
---|
596 | u8 flags; /* flags */ |
---|
597 | u8 int_vector; /* MSI index if MSI is enabled, otherwise reserved */ |
---|
598 | u16 reserved2; |
---|
599 | u16 max_cnt; /* interrupt moderation counter */ |
---|
600 | u8 page_size; /* each mapped page is 2^(12+page_size) bytes */ |
---|
601 | u8 reserved4[3]; |
---|
602 | u32 db_record_addr_h; /*physical address of CQ doorbell record */ |
---|
603 | u32 db_record_addr_l; /*physical address of CQ doorbell record */ |
---|
604 | u32 page_address[0]; /* 64 bit page addresses of CQ buffer */ |
---|
605 | }; |
---|
606 | |
---|
607 | /* CMD CONFIG_RX_RING */ |
---|
608 | struct mtnic_if_config_rx_ring_in_mbox { |
---|
609 | u8 reserved1; |
---|
610 | u8 ring; /* The ring index (with offset) */ |
---|
611 | u8 stride_size; /* stride and size */ |
---|
612 | /* Entry size = 16* (2^stride) bytes */ |
---|
613 | #define MTNIC_MASK_CONFIG_RX_RING_STRIDE MTNIC_BC(4,3) |
---|
614 | /* Rx ring size is 2^size entries */ |
---|
615 | #define MTNIC_MASK_CONFIG_RX_RING_SIZE MTNIC_BC(0,4) |
---|
616 | u8 flags; /* Bit0 - header separation */ |
---|
617 | u8 page_size; /* Each mapped page is 2^(12+page_size) bytes */ |
---|
618 | u8 reserved2[2]; |
---|
619 | u8 cq; /* CQ associated with this ring */ |
---|
620 | u32 db_record_addr_h; |
---|
621 | u32 db_record_addr_l; |
---|
622 | u32 page_address[0];/* Array of 2^size 64b page descriptor addresses */ |
---|
623 | /* Must hold all Rx descriptors + doorbell record. */ |
---|
624 | }; |
---|
625 | |
---|
626 | /* The modifier for SET_RX_RING_ADDR */ |
---|
627 | struct mtnic_if_set_rx_ring_modifier { |
---|
628 | u8 reserved; |
---|
629 | u8 port_num; |
---|
630 | u8 index; |
---|
631 | u8 ring; |
---|
632 | }; |
---|
633 | |
---|
634 | /* CMD SET_RX_RING_ADDR */ |
---|
635 | struct mtnic_if_set_rx_ring_addr_in_imm { |
---|
636 | u16 mac_47_32; /* UCAST MAC Address bits 47:32 */ |
---|
637 | u16 flags_vlan_id; /* MAC/VLAN flags and vlan id */ |
---|
638 | #define MTNIC_MASK_SET_RX_RING_ADDR_VLAN_ID MTNIC_BC(0,12) |
---|
639 | #define MTNIC_MASK_SET_RX_RING_ADDR_BY_MAC MTNIC_BC(12,1) |
---|
640 | #define MTNIC_MASK_SET_RX_RING_ADDR_BY_VLAN MTNIC_BC(13,1) |
---|
641 | u32 mac_31_0; /* UCAST MAC Address bits 31:0 */ |
---|
642 | }; |
---|
643 | |
---|
644 | /* CMD CONFIG_TX_RING */ |
---|
645 | struct mtnic_if_config_send_ring_in_mbox { |
---|
646 | u16 ring; /* The ring index (with offset) */ |
---|
647 | #define MTNIC_MASK_CONFIG_TX_RING_INDEX MTNIC_BC(0,8) |
---|
648 | u8 size; /* Tx ring size is 32*2^size bytes */ |
---|
649 | #define MTNIC_MASK_CONFIG_TX_RING_SIZE MTNIC_BC(0,4) |
---|
650 | u8 reserved; |
---|
651 | u8 page_size; /* Each mapped page is 2^(12+page_size) bytes */ |
---|
652 | u8 qos_class; /* The COS used for this Tx */ |
---|
653 | u16 cq; /* CQ associated with this ring */ |
---|
654 | #define MTNIC_MASK_CONFIG_TX_CQ_INDEX MTNIC_BC(0,8) |
---|
655 | u32 page_address[0]; /* 64 bit page addresses of descriptor buffer. */ |
---|
656 | /* The buffer must accommodate all Tx descriptors */ |
---|
657 | }; |
---|
658 | |
---|
659 | /* CMD CONFIG_EQ */ |
---|
660 | struct mtnic_if_config_eq_in_mbox { |
---|
661 | u8 reserved1; |
---|
662 | u8 int_vector; /* MSI index if MSI enabled; otherwise reserved */ |
---|
663 | #define MTNIC_MASK_CONFIG_EQ_INT_VEC MTNIC_BC(0,6) |
---|
664 | u8 size; /* Num CQs is 2^size entries (size <= 22) */ |
---|
665 | #define MTNIC_MASK_CONFIG_EQ_SIZE MTNIC_BC(0,5) |
---|
666 | u8 offset; /* Start address of CQE in first page (11:6) */ |
---|
667 | #define MTNIC_MASK_CONFIG_EQ_OFFSET MTNIC_BC(0,6) |
---|
668 | u8 page_size; /* Each mapped page is 2^(12+page_size) bytes*/ |
---|
669 | u8 reserved[3]; |
---|
670 | u32 page_address[0]; /* 64 bit page addresses of EQ buffer */ |
---|
671 | }; |
---|
672 | |
---|
673 | /* CMD RELEASE_RESOURCE */ |
---|
674 | enum mtnic_if_resource_types { |
---|
675 | MTNIC_IF_RESOURCE_TYPE_CQ = 0, |
---|
676 | MTNIC_IF_RESOURCE_TYPE_RX_RING, |
---|
677 | MTNIC_IF_RESOURCE_TYPE_TX_RING, |
---|
678 | MTNIC_IF_RESOURCE_TYPE_EQ |
---|
679 | }; |
---|
680 | |
---|
681 | struct mtnic_if_release_resource_in_imm { |
---|
682 | u8 reserved1; |
---|
683 | u8 index; /* must be 0 for TYPE_EQ */ |
---|
684 | u8 reserved2; |
---|
685 | u8 type; /* see enum mtnic_if_resource_types */ |
---|
686 | u32 reserved3; |
---|
687 | }; |
---|
688 | |
---|
689 | |
---|
690 | |
---|
691 | |
---|
692 | |
---|
693 | |
---|
694 | |
---|
695 | |
---|
696 | |
---|
697 | /******************************************************************* |
---|
698 | * |
---|
699 | * PCI addon structures |
---|
700 | * |
---|
701 | ********************************************************************/ |
---|
702 | |
---|
703 | struct pcidev { |
---|
704 | unsigned long bar[6]; |
---|
705 | u32 dev_config_space[64]; |
---|
706 | struct pci_device *dev; |
---|
707 | u8 bus; |
---|
708 | u8 devfn; |
---|
709 | }; |
---|
710 | |
---|
711 | struct dev_pci_struct { |
---|
712 | struct pcidev dev; |
---|
713 | struct pcidev br; |
---|
714 | }; |
---|
715 | |
---|
716 | /* The only global var */ |
---|
717 | struct dev_pci_struct mtnic_pci_dev; |
---|
718 | |
---|
719 | |
---|
720 | |
---|
721 | #endif /* H_MTNIC_IF_DEFS_H */ |
---|
722 | |
---|